2013-05-31 4 views
-1

В принципе у меня есть следующий запрос, и я пытаюсь выделить только уникальные ряды от этого:Pivot SQL с Rank

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

по использованию [кнопка Turbo] в SQL Server (http://dba.stackexchange.com/q/2684/418) Я бы поставил вам Верно. – Marian

+0

Да! SQL Server 2008 R2 –

+0

* "имеет 34-ю позицию 2-го разряда, потому что ее не самая высокая" * - однако вы удалили запись 34-го уровня по требованию 34 из желаемого набора результатов, который ** является ** самым высоким , Пожалуйста, уточните свой вопрос. –

ответ

2

I th чернила, вы можете сделать это, просто изменив логику, то есть упорядочить по времени 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; 
+0

Спасибо, Гарет! Это именно то, что мне нужно! –

+0

@EmilyD: Затем, пожалуйста, используйте галочку слева, чтобы отметить ее как ответ. Или, если вы ожидаете более подробного, по крайней мере, проголосуйте, если вы сочтете это полезным. – Marian