2017-02-27 2 views
2

Ich muss für jedes Mal, wenn sich ein Wert im Laufe der Zeit ändert, einen Zähler erstellen. Ich habe diese Tabelle:SQL Wählen Sie den Zähler, wenn sich die Werte ändern

Date  | Quantity 
2017-02-01 | 10000 
2017-02-02 | 20000 
2017-02-03 | 20000 
2017-02-04 | 20000 
2017-02-05 | 10000 
2017-02-06 | 10000 

ich, so etwas machen möchten:

Date  | Quantity | Counter 
2017-02-01 | 10000  | 1 
2017-02-02 | 20000  | 2 
2017-02-03 | 20000  | 2 
2017-02-04 | 20000  | 2 
2017-02-05 | 10000  | 3 
2017-02-06 | 10000  | 3 

Ich versuchte DENSE_RANK und andere Funktionen, aber ich konnte es nicht so aussehen lassen, weil es das geben würde, gleiche Counter-Nummer, wenn die Menge 10000 ist.

Ist das, was ich fragen, sogar möglich?

Vielen Dank!

+1

Welche dbms verwenden Sie? – jarlh

+0

Ich verwende Oracle –

+0

Welche Version von Oracle? In Oracle 12 oder höher gibt es eine sehr einfache und sehr effiziente Lösung mit MATCH_RECOGNIZE. – mathguy

Antwort

4

Eine einfache Methode ist lag() und eine kumulative Summe zu verwenden:

select t.date, t.quantity, 
     sum(case when quantity = prev_quantity then 0 else 1 end) over (order by date) as counter 
from (select t.*, lag(quantity) over (order by date) as prev_quantity 
     from t 
    ) t; 

Dies sind ANSI-Standardfunktionen und in den meisten Datenbanken.

+0

Das hat perfekt funktioniert. Vielen Dank!! –

2

Einfache Lösung für Oracle 12 und über nur, die MATCH_RECOGNIZE-Klausel:

with 
    test_data (dt, quantity) as (
     select date '2017-02-01', 10000 from dual union all 
     select date '2017-02-02', 20000 from dual union all 
     select date '2017-02-03', 20000 from dual union all 
     select date '2017-02-04', 20000 from dual union all 
     select date '2017-02-05', 10000 from dual union all 
     select date '2017-02-06', 10000 from dual 
    ) 
-- end of test data, for illustration only; WITH clause is NOT part of the query 
-- solution (SQL query) begins BELOW THIS LINE 
select dt, quantity, mn as counter 
from test_data 
match_recognize (
    order by dt 
    measures match_number() as mn 
    all rows per match 
    pattern (a b*) 
    define b as b.quantity = a.quantity 
) 
; 

DT   QUANTITY COUNTER 
---------- ---------- ---------- 
2017-02-01  10000   1 
2017-02-02  20000   2 
2017-02-03  20000   2 
2017-02-04  20000   2 
2017-02-05  10000   3 
2017-02-06  10000   3 

6 rows selected. 
Verwandte Themen