【问题标题】:Number the rows and reset the counter back to 1 on certain condition对行编号并在特定条件下将计数器重置为 1
【发布时间】:2019-11-18 19:40:25
【问题描述】:

如何在 SQL Server 中针对关键字重置计数器?在以下数据中,每次找到字符串'A',计数器都需要重置为1:

Item    Date
A       01.01.2019
B       02.01.2019
C       03.01.2019
D       04.01.2019
A       05.01.2019
B       06.01.2019
A       07.01.2019
B       08.01.2019
C       09.01.2019
D       10.01.2019
E       11.01.2019
A       12.01.2019
A       13.01.2019
A       14.01.2019
B       15.01.2019

每次找到A 时我都需要重置计数器:

Count    Item    Date
1        A       01.01.2019
2        B       02.01.2019
3        C       03.01.2019
4        D       04.01.2019
1        A       05.01.2019
2        B       06.01.2019
1        A       07.01.2019
2        B       08.01.2019
3        C       09.01.2019
4        D       10.01.2019
5        E       11.01.2019
1        A       12.01.2019
1        A       13.01.2019
1        A       14.01.2019
2        B       15.01.2019

【问题讨论】:

  • 从您的问题示例中,似乎始终是 A = 1、B = 2、C = 3 等...如果您的系列中没有漏洞,您可以映射 A=> 1, B=>2, C=> 3 等等...?
  • 同一日期可以有多个项目吗?项目'A' 可以在一个日期重复吗?
  • 我只是在简化我的问题。 Item 是批处理作业的名称,Date 是时间戳。我有一系列子作业的日志条目,我需要找到来自同一批次运行的那些。这有点棘手,因为由于错误,最后一项工作并不总是相同的。起点 (A) 始终被定义,但终点​​可以是 (D)、(B) 或只是 (A) 本身。

标签: sql sql-server tsql window-functions


【解决方案1】:

类似:

WITH cte AS (
    SELECT *, COUNT(CASE WHEN Item = 'A' THEN 1 END) OVER (ORDER BY Date) AS GroupNum
    FROM t
)
SELECT *, ROW_NUMBER() OVER (PARTITION BY GroupNum ORDER BY Date) AS [Count]
FROM cte
ORDER BY Date

每当遇到A 时,cte 都会为每一行分配一个运行计数。根据此计数器为行分配一个ROW_NUMBER()

Demo on db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2021-09-04
    • 2021-10-12
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多