2012-03-26 17 views
1

比方說,我有以下數據表:使用SQL來確定數據的變化率設定

DAY1 ITEM1 30
DAY1 ITEM2 25
DAY1項目3 27
DAY2 ITEM1 30
DAY2 ITEM2 30
DAY2項目3 20
...
dayN ITEM1 20

如何WO uld我構建了一個查詢,每天可以給我每個項目的變化率。

DAY1 ITEM1 rateOfChange:0
DAY1 ITEM2 rateOfChange:-1
DAY1項目3 rateOfChange:5
DAY2 ITEM1 rateOfChange:0
DAY2 ITEM2 rateOfChange:2

我inital思想(不知道SQL太好了),將循環通過每一天,並有一個子查詢前一天檢查每個項目,並有所作爲?

感謝

+0

聽起來像是在客戶端應用程序中更容易完成的事情。 – barsju 2012-03-26 21:33:42

+1

哪些DBMS? (我問,因爲在PostgreSQL或Oracle中有比在MySQL中更聰明的方法)。另外 - 你的表是否真的包含像'day1'和''day2''等值?如果是這樣,這聽起來像我們必須從這些值中提取數字? – ruakh 2012-03-26 21:33:46

+1

你從哪裏得到0,-1,5,0,2? – Teja 2012-03-26 21:35:32

回答

2

如果表被稱爲數據表用了一天,項和值的整數列,這可能做到

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

只需要一個註釋:如果你不想在特定項目開啓的最後一天有記錄,如果您只有一天的該項目的記錄,那麼根本不會返回該項目的任何行。如果你將join加入't2',那麼每一個物品每天都會得到一行,如果是最後一天,那麼'rate'就有'NULL'。 – 2012-03-26 21:46:28

+0

@JeremyPridemore是的,它取決於什麼結果更符合你的需求。但是,如果您確實需要每天使用一行(使用左連接),則還必須更改rate的計算方式以處理t2.value的NULL值。 – Ben 2012-03-26 21:58:58

3

標準SQL的解決方案,在大多數現代DBMS工程

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

大多數現代DBMS - > SQL 2012+ – ScottLenart 2014-05-27 14:12:49

+1

@ScottLenart:這是在SQL:2006標準中引入的,而不是2012 – 2017-05-26 21:13:27

+0

不是根據我找到的任何文章。 https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql – ScottLenart 2017-06-14 15:35:26