SQL Server:保持dense_rank最后的顺序

can*_*ada 0 sql sql-server oracle

我对 Oracle 有以下查询

select 
        max(DW_EXTRACT_DATE)                as DW_EXTRACT_DATE, 
        DW_LOGICAL_DATE     as SELECTION_DATE, 
        max(DW_LOGICAL_DATE)                as DW_LOGICAL_DATE, 
        max(RUNTIME_AUDIT_ID)               as RUNTIME_AUDIT_ID, 
        max(REC_SRC_SYS)                as REC_SRC_SYS, 
        POSITION_ID, 
        EMPLOYEE_ID,  
            PRIMARY_POS,
            INV_STR_DATE,
            max(POS_STOP_DATE) keep (dense_rank last order by INV_STR_DATE)     as POSITION_STOP_DATE,
            max(CHANGE_REASON) keep (dense_rank last order by INV_STR_DATE)     as CHANGE_REASON_CD,
            max(ACTUAL_FTE_PERC) keep (dense_rank last order by INV_STR_DATE)   as ACTUAL_FTE_PERC
      from 
        EMPLOYEE_POSITION 
      where
        POSITION_ID      != 'TERMINATED'
      group by 
        DW_LOGICAL_DATE, 
        POSITION_ID, 
        EMPLOYEE_ID, 
        PRIMARY_POS, 
        INV_STR_DATE
Run Code Online (Sandbox Code Playgroud)

如何对 sql server 做同样的事情?我是 oracle 的新手。

我尝试了以下查询。

SELECT  DW_EXTRACT_DATE,DW_LOGICAL_DATE,RUNTIME_AUDIT_ID,REC_SRC_SYS,REC_SRC_SYS,POSITION_ID,

        EMPLOYEE_ID,  PRIMARY_POS,INV_STR_DATE,POS_STOP_DATE,
            CHANGE_REASON,
            ACTUAL_FTE_PERC
FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY POS_STOP_DATE ORDER BY INV_STR_DATE DESC) Corr
        FROM EMPLOYEE_POSITION
         where POSITION_ID      != 'TERMINATED') A WHERE Corr = 1
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

在 SQL Server 2012+ 中,您可以使用FIRST_VALUE()

所以(为了简单起见):

SELECT max(POS_STOP_DATE) keep (dense_rank last order by INV_STR_DATE) as POSITION_STOP_DATE
FROM EMPLOYEE_POSITION
GROUP BY X;
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2012+ 中可以写成:

SELECT MAX(POSITION_STOP_DATE)
FROM (SELECT ep.*,
             FIRST_VALUE(POS_STOP_DATE) OVER (PARTITION BY X ORDER BY INV_STR_DATE DESC) as POSITION_STOP_DATE
      FROM EMPLOYEE_POSITION ep
     ) ep
GROUP BY x;
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2005+ 中,您可以使用ROW_NUMBER()条件聚合来执行此操作:

SELECT MAX(CASE WHEN seqnum = 1 THEN POS_STOP_DATE END) as POSITION_STOP_DATE)
FROM (SELECT ep.*,
             ROW_NUMBER() OVER (PARTITION BY X ORDER BY INV_STR_DATE DESC) as seqnum
      FROM EMPLOYEE_POSITION ep
     ) ep
GROUP BY x;
Run Code Online (Sandbox Code Playgroud)