我有6列:
Date, Account, Side, Symbol, Currency, Reset Flag (0 Yes, 1 No)
我想通过分区计数行,但每当“重置标志”列中出现0时都要重置行计数。前5列不是唯一的,但它们的组合形成了一个唯一的列集。
请帮助我解决这个问题!
我已经研究了其他的解决方案,但由于某些原因它们都无法工作 :/
我有6列:
Date, Account, Side, Symbol, Currency, Reset Flag (0 Yes, 1 No)
row_number()
通过重置标志来识别组,并在外部查询中使用另一个对行进行编号,以及在内部查询中创建的ResetFlag
和grp
。date,Account,Side,Symbol,Currency
的顺序更改为您想要按行编号的这些列的任何顺序; 对于这三个row_number()
,保持它们的顺序相同。/* ----- */
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
+------------+---------+------+--------+----------+-----------+----+
| 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
是每个逻辑组的唯一编号,该编号使用两个运行编号(row_number()
)计算而来。两者都使用相同的order by
,但具有不同的分区(在本例中一个没有分区,另一个有分区)。这可能会使情况更加清晰: http://rextester.com/KFJHA53489 - SqlZim