1

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

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记录触及排名应该改变,有人可以就此提出建议吗?

4

2 回答 2

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例如

于 2013-01-10T12:18:04.677 回答
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
于 2013-01-10T13:38:29.210 回答