【问题标题】:How do I incrementally assign batch numbers to related rows in SQL Server?如何将批号增量分配给 SQL Server 中的相关行?
【发布时间】:2023-03-13 23:40:01
【问题描述】:

如果我希望在两个字段中的任何一个发生更改时增加批号,我如何在按时间排序的表中增量分配批号?这是原始表格:

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  

我想做的是分配一个批号。请注意,前 2 行分配了相同的编号,因为它们既是客户 A 又是苹果。请注意,在第 4 行,我们与客户 A 一起返回 Apples,但它被分配了下一个批号,而不是返回到第 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

【问题讨论】:

    标签: sql-server tsql window-functions row-number


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2014-08-22
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多