2013-05-31 108 views
-1

基本上我有以下查詢,我想從這個區別只有獨特的行列:樞軸SQL以秩

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 
+0

通過使用SQL Server [Turbo button](http://dba.stackexchange.com/q/2684/418)我敢打賭你對了。 – Marian

+0

是的!SQL Server 2008 R2 –

+0

*「刪除了第34條排名2,因爲它不是最高的」* - 但是,您已從所需的結果集中刪除了第34條排名第1條記錄,其中**是最高的。請你能澄清你的問題嗎? –

回答

2

I th墨水,你可以通過逆轉你的邏輯來完成這個操作,例如按時間順序排序,在最終選擇中切換曲線和預覽,並在最終選擇中將-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; 
+0

謝謝你Gareth!那正是我需要的! –

+0

@EmilyD:然後請使用左側的複選標記將其標記爲答案。或者,如果您希望得到更詳細的信息,至少可以對其進行投票,如果您覺得有用。 – Marian