Sql-Server

T-SQL:為結果塊分配標識符

  • March 5, 2021

我不確定如何準確地表達這個問題,但是……我正在使用現有的數據庫,並且結構是我無法改變的。我想編寫一個查詢,它為查詢返回的結果中相同塊值的每一組分配一個唯一的 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

引用自:https://dba.stackexchange.com/questions/286487