2017-04-08 48 views
2

我有6列:SQL服務器ROW_COUNT與復位

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

我想通過排了數分區,但重置行計數每當0出現在Reset Flag列。前5列不是唯一的,但它們的組合形成了一組獨特的列。

請幫我這個!

每隔解決方案,我已經研究出於某種原因不工作:/

回答

1

這是一個空白和島嶼風格的問題。而不會在外部查詢通過ResetFlag與數行中所有樣本的數據或所期望的結果...

使用兩個row_number()通過復位標誌,以確定組,和另一個與中內部查詢創建的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 | 
+------------+---------+------+--------+----------+-----------+----+ 
+0

非常感謝!如果你能向我解釋grp在做什麼,這將是非常有幫助的 –

+0

@NewbieCoder grp是每個邏輯組的唯一編號,它使用兩個運行編號('row_number()')計算得出。兩者共享相同的'order by',但具有不同的分區(在這種情況下,一個沒有分區,另一個分區)。這可能會讓事情變得更清楚:http://rextester.com/KFJHA53489 – SqlZim

+0

非常感謝! –