2017-04-08 6 views
2

Ich habe 6 Spalten:SQL Server Row_Count mit Reset

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

ich zählen über Partition rudern wollen, aber die Zeilenanzahl, wenn eine 0 in Reset Flag Spalte zurückgesetzt. Die ersten 5 Spalten sind nicht eindeutig, aber ihre Kombination bildet einen eindeutigen Satz von Spalten.

Bitte helfen Sie mir dabei!

Jede andere Lösung, die ich recherchiert habe nicht aus irgendeinem Grunde nicht:/

Antwort

1

Dies ist ein Lücke und Inseln Stil Problem. Ohne Probendaten oder gewünschte Ergebnisse ...

Verwendung von zwei row_number() Gruppen zu identifizieren, indem Rücksetz-Flag und ein anderer in der äußeren Abfrage der Zeilen von ResetFlag und dem grp in der inneren Abfrage erstellt nummerieren.

Ändern Sie die Reihenfolge von date, Account, Side, Symbol, Currency in die Reihenfolge der Spalten, in denen die Zeilen nummeriert werden sollen. Halten Sie sie in der gleichen Reihenfolge für jede der drei 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 Demo: http://rextester.com/VLCO32635

kehrt:

+------------+---------+------+--------+----------+-----------+----+ 
| 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

Vielen Dank! Das funktioniert aber, wenn Sie mir erklären können, was Grp macht, das wäre sehr hilfreich –

+0

@NewbieCoder 'grp' ist eine eindeutige Nummer für jede logische Gruppe, die mit zwei laufenden Zahlen (' row_number() ') berechnet wird. Beide teilen die gleiche 'order by', aber mit unterschiedlichen Partitionen (in diesem Fall eine ohne Partition und eine mit einer Partition). Dies könnte die Dinge ein wenig klarer machen: http://rexttester.com/KFJHA53489 – SqlZim

+0

Vielen Dank !! –

Verwandte Themen