简体   繁体   中英

Pl / SQL Oracle helps to run a Date in Subquery

How could I get the date of the Maximum Value, by means of a subquery I can't put the Date in the Main query because I would have to add it to the group by it would bring me a lot of data

Here is the Code:

  SELECT MAX (A1.VALOR) AS VALOR,
         (SELECT sq1.FECHA
            FROM VARIABLE_VALORES_SMEC sq1
           WHERE sq1.ID_AGENTE = A1.ID_AGENTE)
            MES,                                  -- {<-- Here is the Problem}
         (SELECT CODIGO_AGENTE
            FROM AGENTES
           WHERE ID_AGENTE = A1.ID_AGENTE)
            Agentess,
         (SELECT NOMBRE_AGENTE
            FROM AGENTES
           WHERE ID_AGENTE = A1.ID_AGENTE)
            Nombre_Agente
    FROM VARIABLE_VALORES_SMEC A1
   WHERE     A1.VALOR < '1'
         AND A1.VALOR != '0'
         AND A1.ID_AGENTE IN (SELECT C1.ID_AGENTE
                                FROM VARIABLE_VALORES_SMEC C1
                               WHERE A1.FECHA = C1.FECHA)
         AND A1.ID_AGENTE IN (SELECT B1.ID_AGENTE
                                FROM AGENTES B1
                               WHERE ID_CATEGORIA_AGENTE = 'AC006')
         AND (A1.FECHA BETWEEN (ADD_MONTHS (TO_DATE ( :FECHAIN, 'MM/DD/YYYY'),
                                            -1))
                           AND (LAST_DAY (
                                   ADD_MONTHS (
                                      TO_DATE ( :FECHAIN, 'MM/DD/YYYY'),
                                      -1))))
         AND A1.ID_VARIABLE LIKE '%_calc_total_pot@%'
GROUP BY ID_AGENTE

You can use row_number analytical function to fetch one record for which value is highest and use the fecha of that record. Use following sub query:

(Select fecha from
      (SELECT sq1.FECHA, row_number() over (order by sq1.value desc nulls last) as rn
        FROM VARIABLE_VALORES_SMEC sq1
       WHERE sq1.ID_AGENTE = A1.ID_AGENTE)
Where rn = 1) MES

Am I correct that you need (fecha) for maximum A1.VALOR? If - yes, you can use the following query, or if - no, just replace A1.VALOR with the required column in keep() clause:

  SELECT MAX (A1.VALOR) AS VALOR,
         max(A1.FECHA)keep(dense_rank first order by A1.VALOR desc) MES, -- A1.VALOR is used here as sort key, replace it with what you want
         (SELECT CODIGO_AGENTE
            FROM AGENTES
           WHERE ID_AGENTE = A1.ID_AGENTE)
            Agentess,
         (SELECT NOMBRE_AGENTE
            FROM AGENTES
           WHERE ID_AGENTE = A1.ID_AGENTE)
            Nombre_Agente
    FROM VARIABLE_VALORES_SMEC A1
   WHERE     A1.VALOR < '1'
         AND A1.VALOR != '0'
         AND A1.ID_AGENTE IN (SELECT C1.ID_AGENTE
                                FROM VARIABLE_VALORES_SMEC C1
                               WHERE A1.FECHA = C1.FECHA)
         AND A1.ID_AGENTE IN (SELECT B1.ID_AGENTE
                                FROM AGENTES B1
                               WHERE ID_CATEGORIA_AGENTE = 'AC006')
         AND (A1.FECHA BETWEEN (ADD_MONTHS (TO_DATE ( :FECHAIN, 'MM/DD/YYYY'),
                                            -1))
                           AND (LAST_DAY (
                                   ADD_MONTHS (
                                      TO_DATE ( :FECHAIN, 'MM/DD/YYYY'),
                                      -1))))
         AND A1.ID_VARIABLE LIKE '%_calc_total_pot@%'
GROUP BY ID_AGENTE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM