TSQL如何为同一组中的所有行添加相同的标识号,然后为下一组增加等等

时间:2013-10-30 14:18:03

标签: sql-server-2008 tsql

如果我有来自CTE的输出数据集,看起来像

PERIOD  FT  GROUP   DEPT    VALUE
1   Actual  KINDER  MATH    200
2   Actual  KINDER  MATH    363
3   Actual  KINDER  MATH    366
1   Budget  KINDER  MATH    457
2   Budget  KINDER  MATH    60
3   Budget  KINDER  MATH    158
1   Actual  HIGHSCH ENGLISH 456
2   Actual  HIGHSCH ENGLISH 745
3   Actual  HIGHSCH ENGLISH 125
1   Budget  HIGHSCH ENGLISH 364
2   Budget  HIGHSCH ENGLISH 158
3   Budget  HIGHSCH ENGLISH 200
6   Budget  HIGHSCH ENGLISH 502
7   Budget  HIGHSCH ENGLISH 650
1   Actual  COLL    ENGLISH 700
2   Actual  COLL    ENGLISH 540
3   Actual  COLL    ENGLISH 160
1   Budget  COLL    ENGLISH 820
2   Budget  COLL    ENGLISH 630
3   Budget  COLL    ENGLISH 800

但我想添加一个列,其中包含每个组的标识符(分组由FT,Group和Dept组成),如下所示:

PERIOD  FT  GROUP   DEPT    VALUE   GroupID 
1   Actual  KINDER  MATH    200 1   
2   Actual  KINDER  MATH    363 1   
3   Actual  KINDER  MATH    366 1   
1   Budget  KINDER  MATH    457 2   
2   Budget  KINDER  MATH    60  2   
3   Budget  KINDER  MATH    158 2   
1   Actual  HIGHSCH ENGLISH 456 3   
2   Actual  HIGHSCH ENGLISH 745 3   
3   Actual  HIGHSCH ENGLISH 125 3   
1   Budget  HIGHSCH ENGLISH 364 4   
2   Budget  HIGHSCH ENGLISH 158 4   
3   Budget  HIGHSCH ENGLISH 200 4   
1   Budget  HIGHSCH ENGLISH 502 5   
2   Budget  HIGHSCH ENGLISH 650 5   
3   Budget  HIGHSCH ENGLISH 336 5   
1   Actual  COLL    ENGLISH 700 6   
2   Actual  COLL    ENGLISH 540 6   
3   Actual  COLL    ENGLISH 160 6   
1   Budget  COLL    ENGLISH 820 7   
2   Budget  COLL    ENGLISH 630 7   
3   Budget  COLL    ENGLISH 800 7   

请知道怎么办吗?

编辑: 我觉得这个方向的东西可能有用

SELECT *, 
       CASE WHEN FT = 'Actual' THEN <something_incremental_to_do_with_row_num> OVER (PARTITION DEPT, GROUP, FT) END as GROUPID 
FROM cte

我不能在OVER子句中使用ORDER BY,因为我在2008年

2 个答案:

答案 0 :(得分:0)

很难说没有看到查询的SQL,但我认为'row_number()([某些字段]分区)'的变体会给你这个。你看过那个吗?

这个现有问题可能会为您提供所需: How to add sequence number for groups in a SQL query without temp tables

答案 1 :(得分:0)

陈,我相信你的答案已经在另一个帖子中提供了:

How to return a incremental group number per group in SQL

此外,您可以通过连接字段为每个组创建unique_id。例如,如果您想按FT,GROUP和DEPT分组,那么只需将它们放在一起即可。例如:

SELECT *, 
       CAST(FT AS VARCHAR) +
       CAST([GROUP] AS VARCHAR) +
       CAST(DEPT AS VARCHAR) AS UNIQUE_ID
FROM MYTABLE

如果您想使用它一段时间来执行更复杂的查询,那么只需将其放入临时表:

SELECT *, 
       CAST(FT AS VARCHAR) +
       CAST([GROUP] AS VARCHAR) +
       CAST(DEPT AS VARCHAR) AS UNIQUE_ID
INTO #MYTEMPTABLE
FROM MYTABLE

如果要加入的字段中有不同的数据类型,则只需要CAST功能。最好保持它以避免任何不必要的麻烦。希望这会有所帮助。