-1

基本上我有以下查询,我试图区分唯一的等级:

    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

但是我只想看到以下内容:(删除Claim 34 Rank 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
4

1 回答 1

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;
于 2013-05-31T13:06:15.320 回答