SQL Server: how to imitate oracle keep dense_rank query?

前端 未结 5 1945
既然无缘
既然无缘 2020-12-20 17:46

I have an Oracle query

select max(m.id),
       m.someId keep (DENSE_RANK FIRST ORDER BY m.UpdateDate desc) 
from MyTable m 
groupBy m.someId
5条回答
  •  余生分开走
    2020-12-20 18:17

    That will work absolutely. Try first, then argue. When you have multiple order by you can do this(example made on Oracle):

    -- this one with keep dense_rank

    WITH a AS (SELECT 1 s1, 4 s2, 'a' c,  10 g FROM dual UNION all
               SELECT 2 s1, 2 s2, 'b' c,  10 g FROM dual UNION ALL
               SELECT 3 s1, 1 s2, 'c' c,  20 g FROM dual UNION ALL
               SELECT 4 s1, 3 s2, 'd' c,  20 g FROM dual)
    SELECT g,
           MAX(c) KEEP (DENSE_RANK FIRST ORDER BY s1) s1,
           MAX(c) KEEP (DENSE_RANK FIRST ORDER BY s2) s2
      FROM a
     GROUP BY g
    

    -- This one without keep dense_rank

        WITH a AS (SELECT 1 s1, 4 s2, 'a' c,  10 g FROM dual UNION all
                   SELECT 2 s1, 2 s2, 'b' c,  10 g FROM dual UNION ALL
                   SELECT 3 s1, 1 s2, 'c' c,  20 g FROM dual UNION ALL
                   SELECT 4 s1, 3 s2, 'd' c,  20 g FROM dual)
    SELECT g,
           MAX(DECODE(s1, 1, c)) s1,
           MAX(DECODE(s2, 1, c)) s2
      FROM (SELECT g,c,
                   ROW_NUMBER() OVER (PARTITION BY g ORDER BY s1) s1,
                   ROW_NUMBER() OVER (PARTITION BY g ORDER BY s2) s2 
              FROM a) b
     GROUP BY g
    

提交回复
热议问题