2012-03-26 10 views
1

Lassen Sie uns sagen, dass ich mit den folgenden Daten eine Tabelle haben:sql Änderungsrate der Daten zu bestimmen, setzen

day1 ITEM1 30
day1 item2 25
day1 item3 27
day2 ITEM1 30
day2 item2 30
day2 item3 20
...
Dayn 20 iTEM1

Wie wo Ich strukturiere eine Abfrage, die mir die Änderungsrate für jeden Artikel auf einer täglichen Basis geben kann.

day1 item1 rateOfChange: 0
day1 item2 rateOfChange: -1
day1 item3 rateOfChange: 5
day2 item1 rateOfChange: 0
day2 item2 rateOfChange: 2

Mein inital Gedanken (ohne SQL-Kenntnisse zu gut), würde jeden Tag durchlaufen, und eine Unterabfrage haben, die für jeden Artikel für den Vortag überprüft und einen Unterschied macht?

Dank

+0

Klingt wie etwas, was in einer Client-Anwendung einfacher ist. – barsju

+1

Welches DBMS? (Ich frage, weil es zum Beispiel in PostgreSQL oder Oracle etwas schlauere Möglichkeiten gibt als in MySQL.) Außerdem - enthält Ihre Tabelle wirklich Werte wie "Day1" und "Day2" usw.? Wenn ja, klingt es, als müssten wir die Zahlen aus diesen Werten extrahieren? – ruakh

+1

Woher bekommst du 0, -1,5,0,2? – Teja

Antwort

2

Wenn Sie Tabelle Datatable mit einem Tag, Punkt und Wert Integer-Spalten genannt wurde, könnte dies es tun

SELECT t1.day, t1.item, (t2.value - t1.value) as rate 
FROM datatable t1 
INNER JOIN datatable t2 
ON t1.item = t2.item 
AND t1.day + 1 = t2.day 
+0

Nur ein Hinweis: Dies funktioniert, wenn Sie keinen Datensatz für den letzten Tag möchten, an dem ein bestimmter Artikel aktiv ist. Wenn Sie nur einen Datensatz für diesen Artikel für einen Tag haben, gibt dies keine Zeilen für diesen Artikel zurück. Wenn Sie sich mit 't2' verbunden haben, erhalten Sie für jeden Eintrag eine Zeile für jeden Tag und haben' NULL' für 'Rate', wenn es der letzte Tag ist. –

+0

@ JeremyPridemore Yup, es hängt davon ab, welche Ergebnisse für Ihre Bedürfnisse sinnvoller sind. Wenn Sie jedoch eine Zeile für jeden Tag (mit dem linken Join) möchten, müssen Sie auch ändern, wie die Rate berechnet wird, um den NULL-Wert für t2.value zu behandeln. – Ben

3

Eine Standard-SQL-Lösung, die auf den meisten modernen DBMS funktioniert

SELECT day, 
     item, 
     value, 
     value - lag(value) over (partition by item order by day) as diff_to_prev 
FROM your_table 
ORDER by day, item 
+0

Die meisten modernen DBMS -> SQL 2012+ – ScottLenart

+1

@ScottLenart: das wurde in der SQL: 2006 Standard eingeführt, nicht 2012 –

+0

Nicht nach einem Artikel, den ich finde. https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql – ScottLenart

Verwandte Themen