如何在SQL Server 2005中基于行和排名拆分数据?

时间:2013-01-10 11:59:04

标签: sql sql-server-2005

我有一个示例数据,我需要根据排名和记录基础拆分数据,数据看起来如下格式。

Rank    Rec_Type    Rec Load_Dt
--------------------------------------
1   PH  XXXXXXXXXXXXXXXXX   2012-12-23
2   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
3   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
4   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
5   CD  YYYYYYYYYYYYYYYYYYY 2012-12-23
6   PT  XXXXXXXXXXXXXXXXX   2012-12-23
7   PH  XXXXXXXXXXXXXXXXX   2012-12-23
8   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
9   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
10  PT  XXXXXXXXXXXXXXXXX   2012-12-23

PH是标题,PT是预告片,在将数据从登台表格式化到最终表时,我需要根据标题和详细信息基础以及排名数来分割数据。

输出应如下所示:

Rank    RankNum Rec_Type    Rec Load_Dt
------------------------------------------
1   1   PH  XXXXXXXXXXXXXXXXX   2012-12-23
1   2   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
1   3   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
1   4   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
1   5   CD  YYYYYYYYYYYYYYYYYYY 2012-12-23
1   6   PT  XXXXXXXXXXXXXXXXX   2012-12-23
2   7   PH  XXXXXXXXXXXXXXXXX   2012-12-23
2   8   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
2   9   DE  YYYYYYYYYYYYYYYYYYY 2012-12-23
2   10  PT  XXXXXXXXXXXXXXXXX   2012-12-23

一旦PT记录触及等级应该改变,任何人都可以建议吗?

2 个答案:

答案 0 :(得分:1)

我认为这会为你做到

SELECT
    SUM(CASE WHEN B.Rank IS NULL THEN 0 ELSE 1 END) + 1 Rank,
    A.Rank RankNum,
    A.Rec_Type,
    A.Rec,
    A.Load_Dt
FROM
    MyTable A
    LEFT JOIN MyTable B ON B.Rec_Type = 'PT' AND B.Rank < A.Rank
GROUP BY
    A.Rank,
    A.Rec_Type,
    A.Rec,
    A.Load_Dt

例如,请参阅http://sqlfiddle.com/#!3/3747f/1

答案 1 :(得分:1)

这会花费相同或更少的时间来执行吗?

SELECT
  Rank = (SELECT COUNT(*) FROM MyTable WHERE Rank<=A.Rank AND Rec_Type = 'PH')  ,
  A.Rank RankNum,
  A.Rec_Type,
  A.Rec,
  A.Load_Dt
FROM
  MyTable A