使用Rank旋转SQL

时间:2013-05-31 12:38:32

标签: sql sql-server-2008-r2

基本上我有以下查询,我试图区分这个独特的排名:

    WITH numbered_rows
    as (
    SELECT Claim,
           reserve,
           time,
           RANK() OVER (PARTITION BY ClaimNumber ORDER BY time asc) as 'Rank'
   FROM (          
   SELECT cc.Claim, 
          MAX(csd.time) as time,
          csd.reserve

   FROM ClaimData csd WITH (NOLOCK) 

        JOIN Core cc WITH (NOLOCK) 
            on cc.ClaimID = csd.ClaimID

    GROUP BY cc.Claim, csd.Reserve

        ) as t
    ) 
    select  *
    from numbered_rows cur, numbered_rows prev
    where cur.Claim= prev.Claim
          and cur.Rank = prev.Rank -1

我得到的结果如下:

Claim  reserve  Time        Rank  Claim  reserve    Time     Rank
--------------------------------------------------------------------
11     0        12/10/2012  1     11     15000    5/30/2013  2
34     2000     1/21/2013   1     34     750      1/31/2013  2
34     750      1/31/2013   2     34     0        3/31/2013  3
07     800000   5/9/2013    1     07     0        5/10/2013  2

但我只想看到以下内容:(已将34级排名2删除,因为它不是最高的

Claim  reserve  Time        Rank  Claim  reserve    Time     Rank
--------------------------------------------------------------------
11     0        12/10/2012  1     11     15000    5/30/2013  2
34     750      1/31/2013   2     34     0        3/31/2013  3
07     800000   5/9/2013    1     07     0        5/10/2013  2

1 个答案:

答案 0 :(得分:2)

我认为你可以通过颠倒你的逻辑来做到这一点,即按时间顺序DESC,在最终选择中切换cur和prev并在最终选择中将-1更改为+1,然后将prev.rank限制为1,因此,确保您只包含每项索赔的最新2个结果:

WITH numbered_rows AS
(   SELECT  Claim,
            reserve,
            time,
            [Rank] = RANK() OVER (PARTITION BY ClaimNumber ORDER BY time DESC)
    FROM    (   SELECT  cc.Claim, 
                        [Time] = MAX(csd.time),
                        csd.reserve
                FROM    ClaimData AS csd WITH (NOLOCK) 
                        INNER JOIN JOIN Core AS cc WITH (NOLOCK) 
                            ON cc.ClaimID = csd.ClaimID
                GROUP BY cc.Claim, csd.Reserve
            ) t
)
SELECT  *
FROM    numbered_rows AS prev
        INNER JOIN numbered_rows AS cur
            ON cur.Claim= prev.Claim
            AND cur.Rank = prev.Rank + 1
WHERE   prev.Rank = 1;