2015-05-29 15 views
-2

我的表是這樣的:查找變化

datetime    | value 
----------------------------------- 
2015-05-01 12:23:41 | 12 
2015-05-01 22:13:11 | 21 
2015-05-02 9:13:41  | 23 
2015-05-02 17:23:41 | 32 

每一天都有通過隨機的時間約100項。 我需要計算如下:

  1. 每天增加 - 今天的第一項和第一 進入昨日(每天)
  2. 每日平均增長之間的差異 - 平均價值之間今天差和平均 值昨天(每天)

如何編寫SQL查詢以獲取這些值?

+1

你到目前爲止嘗試過什麼?我們不在這裏爲你做你的工作。 –

+0

你還在試圖解決這個問題嗎? – AdamMc331

+0

是的,對於第一個評論我想說我做了紅寶石代碼計算,他們是超醜,所以我來這裏得到有效和beuty答案通過解決它在純SQL。,因爲我嘗試和失敗(我是在SQL中相當糟糕)。目前我正在做我最後的大學工作,所以我有點忙,當我得到自由時,我會重構我醜陋的代碼,並接受答案 –

回答

1

我會做什麼讓每個日期的第一個條目是按日期部分,並獲得這樣的最小日期時間:

SELECT DATE(dateCol), MIN(dateCol) 
FROM myTable 
GROUP BY DATE(dateCol); 

這將有助於你會看到如下結果:

| 2015-05-01 | 2015-05-01 12:23:41 | 

一旦你有這些值,你可以加入這兩個表結合在一起,讓旁邊的前一個每個日期,就像這樣:

SELECT t1.firstDate, t2.secondDate 
FROM(
    SELECT DATE(dateCol) AS wholeDate, MIN(dateCol) AS firstDate 
    FROM myTable 
    GROUP BY DATE(dateCol)) t1 
JOIN(
    SELECT DATE(dateCol) AS wholeDate, MIN(dateCol) AS secondDate 
    FROM myTable 
    GROUP BY DATE(dateCol)) t2 ON t1.wholeDate < t2.wholeDate AND t2.wholeDate = (SELECT MIN(DATE(dateCol)) FROM myTable WHERE DATE(dateCol) > DATE(t1.wholeDate)); 

然後,所有你需要做的就是調整你的SELECT語句來獲得差異。您還可以加入回到原來的表來獲取值:

SELECT t1.firstDate, t2.secondDate, (s.value - f.value) AS difference 
FROM(
    SELECT DATE(dateCol) AS wholeDate, MIN(dateCol) AS firstDate 
    FROM myTable 
    GROUP BY DATE(dateCol)) t1 
JOIN(
    SELECT DATE(dateCol) AS wholeDate, MIN(dateCol) AS secondDate 
    FROM myTable 
    GROUP BY DATE(dateCol)) t2 ON t1.wholeDate < t2.wholeDate AND t2.wholeDate = (SELECT MIN(DATE(dateCol)) FROM myTable WHERE DATE(dateCol) > DATE(t1.wholeDate)) 
JOIN myTable f ON f.dateCol = t1.firstDate 
JOIN myTable s ON s.dateCol = t2.secondDate; 

對於第二部分,你需要計算平均每個日期,然後再加入表以類似的方式,看看從日期到日期的平均值差異。

這裏是一個SQL Fiddle的例子,這裏是一個similar question也可以幫助你。

-1

http://sqlfiddle.com/#!9/8cc73/1

SELECT DATE(`datetime`), MAX(`value`)-MIN(`value`) 
FROM table1 
GROUP BY DATE(`datetime`) 

SELECT AVG(`increase`) 
FROM (
SELECT DATE(`datetime`), MAX(`value`)-MIN(`value`) as increase 
FROM table1 
GROUP BY DATE(`datetime`) 
) as t