如何将批号增量分配给 SQL 服务器中的相关行?

How do I incrementally assign batch numbers to related rows in SQL Server?

如果我希望批号在 2 个字段中的任何一个发生变化时增加,我该如何按时间顺序递增分配批号 table?这是原文table:

Customer  Item     Time    
A         Apples   1:00 PM  
A         Apples   1:10 PM  
A         Oranges  1:20 PM  
A         Apples   1:30 PM  
B         Oranges  1:40 PM  
A         Apples   1:50 PM  
C         Apples   2:00 PM  

我想做的是分配一个批号。请注意,前两行分配了相同的编号,因为它们都是客户 A 和苹果。请注意,在第 4 行,我们 return 给客户 A 的苹果,但它被分配了下一个批次编号,而不是回到第 1 批次:

Customer  Item     Time     Batch
A         Apples   1:00 PM  1
A         Apples   1:10 PM  1
A         Oranges  1:20 PM  2
A         Apples   1:30 PM  3
B         Oranges  1:40 PM  4
A         Apples   1:50 PM  5
C         Apples   2:00 PM  6

您可以使用 LAG 函数来确定其中一个字段是否更改。使用 运行 总和对更改进行编号:

WITH cte AS (
    SELECT *, CASE
        WHEN LAG(Customer) OVER (ORDER BY Time) = Customer AND LAG(Item) OVER (ORDER BY Time) = Item THEN 0
        ELSE 1
    END AS chg
    FROM t
)
SELECT *, SUM(chg) OVER (ORDER BY Time) AS batch
FROM cte