Мин. Функция выбора 3 столбца - PullRequest
0 голосов
/ 10 октября 2018

У меня есть SQL-оператор, в котором я хочу выбрать мин даты:

SELECT EEEV_EMPL_ID, MIN(EEEV_DT), prev

Но я не хочу включать в мин столбец prev, но я хочу, чтобы этот столбец был в результате.Скажем, у меня есть

1   3/5/2018    UB3 
1   5/28/2018   4A

, где первый столбец - это идентификатор сотрудника, второй - дата, третий - пред.Если я сделаю это, обе строки будут возвращены, потому что предыдущий столбец отличается.Я хочу вернуть только строку с минимальной датой, независимо от того, был ли предыдущий столбец другим.Как мне это сделать?

Это полный оператор:

SELECT EEEV_EMPL_ID, EEEV_DT, prev
FROM (
       SELECT EEEV_EMPL_ID, EEEV_DT, EEEV_CCTR_ID,LAG(EEEV_CCTR_ID)          
              OVER(ORDER BY EEEV_EMPL_ID DESC, EEEV_DT DESC) AS prev      
       FROM CDAS.VDWHEEEV1 eeev1 
       WHERE extract(year from eeev1.eeev_dt) = 
             (select extract(year from sysdate) from dual) 
       ORDER BY EEEV_EMPL_ID
     ) x
GROUP BY EEEV_EMPL_ID, prev
ORDER BY EEEV_EMPL_ID

Это запрос оракула, но я буду использовать его в OPENQUERY на сервере SQL.

Обновление:

ОК, поэтому некоторые люди не могут понять, позвольте мне попробовать это:

00012662    3/5/18     2C
00012662    5/28/18    UB3
00037465    3/19/18    PA
00037465    5/28/18    UB
...

Я хочу эти две строкивернулся.Для каждого сотрудника я хочу строку минимального значения даты.Но поскольку третий столбец отличается, минимальное значение даты будет возвращать каждую строку.Не знаю, как проще спросить это.

00012662    3/5/18     2C
00037465    3/19/18    PA

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Ответ лежит в функции LAG.

SELECT
      EEEV_EMPL_ID, 
      EEEV_DT, 
      EEEV_CCTR_ID, 
      LAG(EEEV_CCTR_ID, 1, ' ') OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_EMPL_ID    DESC, EEEV_END_DT ASC) AS prev
FROM    
      CDAS.VDWHEEEV1 eeev1

С помощью функции запаздывания вы можете разбивать данные, поэтому основывайте их только на желаемой колонке.Окончательный запрос приведен ниже:

SELECT 
        EEEV_EMPL_ID, 
        EEEV_DT, 
        EEEV_CCTR_ID, 
        prev
FROM
        (
            SELECT 
                    EEEV_EMPL_ID, 
                    EEEV_DT, 
                    MIN(EEEV_DT) OVER(PARTITION BY EEEV_EMPL_ID) AS EEEV_DT1, 
                    EEEV_CCTR_ID, 
                    prev
            FROM 
                (
                        SELECT
                                EEEV_EMPL_ID, 
                                EEEV_DT, 
                                EEEV_CCTR_ID, 
                                LAG(EEEV_CCTR_ID, 1, ' ') OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_EMPL_ID DESC, EEEV_END_DT ASC) AS prev
                        FROM    
                                CDAS.VDWHEEEV1 eeev1
                        ORDER BY 
                                EEEV_EMPL_ID
                ) x
            WHERE 
                    extract(year from eeev_dt) = (select extract(year from sysdate) from dual) AND
                    EEEV_CCTR_ID IN (@cctrlst)
            ORDER BY
                    EEEV_EMPL_ID
        )
WHERE EEEV_DT = EEEV_DT1
ORDER BY
        EEEV_EMPL_ID

Этот запрос предоставил решение, необходимое для получения результатов, которые я искал в исходном сообщении.

0 голосов
/ 10 октября 2018

Я не уверен на 100%, что вы хотите, потому что это не ясно, но я думаю, что-то вроде этого.

SELECT *
FROM 
    (
      SELECT EEEV_EMPL_ID, 
             EEEV_DT, 
             prev, 
             ROW_NUMBER() OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_DT) theRow
      FROM CDAS.VDWHEEEV1 eeev1 
      WHERE extract(year from eeev1.eeev_dt) = (SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual) 
    ) a
WHERE theRow = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...