如何将批号增量分配给 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
如果我希望批号在 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