最小函数 select 3 列

Min Function select 3 columns

我有一个 sql 语句,我想 select 日期的最小值:

SELECT EEEV_EMPL_ID, MIN(EEEV_DT), prev

但我不想在最小值中包含上一列,但我希望在结果中包含该列。所以说我有

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

其中第一列是员工编号,第二列是日期,第三列是前任。如果我这样做,两行都将被 returned 因为前一列不同。我只想 return 具有最短日期的行,而不管上一列是否不同。我该怎么做?

这是完整的声明:

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

这是一个 oracle 查询,但我将在 sql 服务器的 OPENQUERY 中使用它。

更新:

好的,所以有些人不清楚,让我试试这个:

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

我想要这两行 returned。对于每个员工,我都想要最小日期值行。但由于第三列不同,最小日期值将 return 每行。不知道怎么问更简单

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

我不是 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

答案就在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

这个查询提供了我需要的解决方案来获得我在原始 post 中寻找的结果。