Sql-Server
T-SQL:為結果塊分配標識符
我不確定如何準確地表達這個問題,但是……我正在使用現有的數據庫,並且結構是我無法改變的。我想編寫一個查詢,它為查詢返回的結果中相同塊值的每一組分配一個唯一的 id。
一個例子可能會有所幫助!如果我有一條 SQL 語句,例如
SELECT Id, Title, Block, Order FROM TableName ORDER BY Order ASC
返回結果:
是否有任何相當直接的方法來生成結果,為每個結果塊提供唯一的 id,例如:
我希望這足夠清楚:) 提前感謝您的幫助!
引用SQL Server 滯後函式對列值更改對錶行進行分組:
--demo setup drop table if exists Table1; go CREATE TABLE Table1 ([Id] int, [Title] varchar(7), [BlockName] varchar(3), [Order] int) ; INSERT INTO Table1 ([Id], [Title], [BlockName], [Order]) VALUES (100, 'Title A', 'Foo', 1), (101, 'Title B', 'Foo', 2), (102, 'Title C', 'Foo', 3), (103, 'Title D', 'Bar', 4), (104, 'Title E', 'Bar', 5), (105, 'Title F', 'Foo', 6) ; --solution ;WITH cte AS ( SELECT id ,Title ,BlockName ,[Order] ,lag(BlockName, 1, '') OVER ( ORDER BY [Order] ) previous ,CASE WHEN ( lag(BlockName, 1, '') OVER ( ORDER BY [Order] ) ) = BlockName THEN 0 ELSE 1 END ischange FROM Table1 ) ,tbl AS ( SELECT t.* ,( SELECT sum(ischange) FROM cte WHERE id <= t.id ) groupno FROM cte t ) SELECT Id ,Title ,BlockName ,[Order] ,groupno AS BlockGroup FROM tbl
Id Title BlockName Order BlockGroup ----------- ------- --------- ----------- ----------- 100 Title A Foo 1 1 101 Title B Foo 2 1 102 Title C Foo 3 1 103 Title D Bar 4 2 104 Title E Bar 5 2 105 Title F Foo 6 3