带重置的 SQL Server Row_Count
Posted
技术标签:
【中文标题】带重置的 SQL Server Row_Count【英文标题】:SQL Server Row_Count with Reset 【发布时间】:2017-04-08 00:19:35 【问题描述】:我有 6 列:
Date, Account, Side, Symbol, Currency, Reset Flag (0 Yes, 1 No)
我想对分区进行行计数,但每当Reset Flag
列中出现 0 时重置行计数。前 5 列不是唯一的,但它们的组合形成了一组唯一的列。
请帮帮我!
由于某种原因,我研究过的所有其他解决方案都不起作用:/
【问题讨论】:
【参考方案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 正在做什么,这将非常有用 @NewbieCodergrp
是使用两个运行数字 (row_number()
) 计算的每个逻辑组的唯一编号。两者共享相同的order by
,但具有不同的分区(在这种情况下,一个没有分区,一个有分区)。这可能会让事情更清楚一点:rextester.com/KFJHA53489以上是关于带重置的 SQL Server Row_Count的主要内容,如果未能解决你的问题,请参考以下文章
在 Microsoft SQL Server 2008 R2 中重置自动增量