【问题标题】:SQL Server Row_Count with Reset带重置的 SQL Server Row_Count
【发布时间】:2017-04-08 00:19:35
【问题描述】:

我有 6 列:

Date, Account, Side, Symbol, Currency, Reset Flag (0 Yes, 1 No)

我想对分区进行行计数,但每当Reset Flag 列中出现 0 时重置行计数。前 5 列不是唯一的,但它们的组合形成了一组唯一的列。

请帮帮我!

由于某种原因,我研究过的所有其他解决方案都不起作用:/

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 gaps-and-islands


    【解决方案1】:

    这是一个空白和孤岛风格的问题。没有任何样本数据或期望的结果...

    使用两个row_number() 通过重置标志来识别组,另一个在外部查询中使用ResetFlag 和在内部查询中创建的grp 对行进行编号。

    date, Account, Side, Symbol, Currency 的顺序更改为您希望对行进行编号的那些列的顺序;将三个row_number()s 中的每一个都保持相同的顺序。

    /* ----- */ 
    select 
        date
      , Account
      , Side
      , Symbol
      , Currency
      , ResetFlag
      , rn = case when ResetFlag = 0 then 0
             else row_number() over (
                partition by ResetFlag, grp
                order by date, Account, Side, Symbol, Currency)
             end
    from (
      select *
        , grp = row_number() over (order by date, Account, Side, Symbol, Currency) 
              - row_number() over (
                  partition by ResetFlag 
                  order by date, Account, Side, Symbol, Currency)
      from t
      ) s
    order by date, Account, Side, Symbol, Currency
    

    rextester 演示:http://rextester.com/VLCO32635

    返回:

    +------------+---------+------+--------+----------+-----------+----+
    |    date    | Account | Side | Symbol | Currency | ResetFlag | rn |
    +------------+---------+------+--------+----------+-----------+----+
    | 2017-01-01 |       7 |    2 |      3 | 7,0000   |         1 |  1 |
    | 2017-01-02 |       8 |    9 |      9 | 6,0000   |         1 |  2 |
    | 2017-01-03 |       4 |    1 |      5 | 6,0000   |         1 |  3 |
    | 2017-01-04 |       5 |    4 |      8 | 5,0000   |         0 |  0 |
    | 2017-01-05 |       2 |    1 |      3 | 1,0000   |         1 |  1 |
    | 2017-01-06 |       8 |    0 |      2 | 0,0000   |         0 |  0 |
    | 2017-01-07 |       0 |    3 |      8 | 9,0000   |         1 |  1 |
    | 2017-01-08 |       0 |    3 |      1 | 3,0000   |         1 |  2 |
    +------------+---------+------+--------+----------+-----------+----+
    

    【讨论】:

    • 非常感谢!如果你能向我解释 grp 正在做什么,这将非常有用
    • @NewbieCoder grp 是使用两个运行数字 (row_number()) 计算的每个逻辑组的唯一编号。两者共享相同的order by,但具有不同的分区(在这种情况下,一个没有分区,一个有分区)。这可能会让事情更清楚一点:rextester.com/KFJHA53489
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多