【问题标题】:How to renumber rows by groups如何按组重新编号行
【发布时间】:2014-08-26 10:05:35
【问题描述】:

我需要在SeqNo 列中按组 (Class, Color, Type) 序列对行重新编号,来自:

Class  | Color | Type | SeqNo
Animal | Brown | Terr | 1
Animal | Brown | Aqua | 3
Animal | White | Terr | 3
Plant  | Green | Aqua | 2
Plant  | Green | Aqua | 2
Plant  | Green | Aqua | 2
Platn  | Green | Terr | 9

到:

Class  | Color | Type | SeqNo
Animal | Brown | Terr | 1
Animal | Brown | Aqua | 2
Animal | White | Terr | 1
Plant  | Green | Aqua | 1
Plant  | Green | Aqua | 1
Plant  | Green | Aqua | 1
Plant  | Green | Terr | 2

请问该怎么做?

【问题讨论】:

  • ROW_NUMBER() 会有所帮助
  • @Adrian Wragg 啊,对不起,谢谢提示

标签: sql sql-server sql-server-2012 group-by sequence


【解决方案1】:

您需要使用DENSE_RANK() 函数对您的序列和中间结果集的CTE 进行编号。

INSERT INTO @t VALUES
('Animal', 'Brown', 'Terr', 1),
('Animal', 'Brown', 'Aqua', 3),
('Animal', 'White', 'Terr', 3),
('Plant', 'Green', 'Aqua', 2),
('Plant', 'Green', 'Aqua', 2),
('Plant', 'Green', 'Aqua', 2),
('Plant', 'Green', 'Terr', 9)

;WITH cte AS(
SELECT *, DENSE_RANK() OVER (PARTITION BY Class, Color ORDER BY Class, Color, Type) AS NewSeq 
FROM @t 
) 
UPDATE t1
SET t1.SeqNo = t2.NewSeq
FROM @t AS t1
INNER JOIN cte AS t2 ON t1.Class = t2.Class AND t1.Color = t2.Color AND t1.Type = t2.Type

SELECT * FROM @t

输出:

Class   Color   Type    SeqNo
Animal  Brown   Terr    2
Animal  Brown   Aqua    1
Animal  White   Terr    1
Plant   Green   Aqua    1
Plant   Green   Aqua    1
Plant   Green   Aqua    1
Plant   Green   Terr    2

【讨论】:

  • 你也可以使用:;WITH cte AS( SELECT Class, Color, Type, ROW_NUMBER() OVER (PARTITION BY Class, Color ORDER BY Class, Color, Type) AS NewSeq FROM @t GROUP BY Class, Color, Type ) UPDATE ...;
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 2012-02-18
  • 2018-01-26
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多