2013-01-15 70 views
1

我有一個新的數據定期更新一個相當大的表樣的,看起來像這樣的最大區別:Mysql的選擇行

id | name | c1 | c2 | c3 | c4 | time 
------------------------------------------------- 
1 | miley | 23 | 11 | 21 | 18 | 2013-01-13 20:26:25 
2 | john | 31 | 29 | 23 | 27 | 2013-01-13 20:26:25 
3 | steve | 44 | 31 | 33 | 35 | 2013-01-13 20:26:25 
4 | miley | 34 | 44 | 47 | 48 | 2013-01-14 08:26:25 
5 | john | 27 | 53 | 49 | 52 | 2013-01-14 08:26:25 
6 | steve | 27 | 62 | 50 | 64 | 2013-01-14 08:26:25 
7 | miley | 44 | 54 | 57 | 87 | 2013-01-14 20:26:25 
8 | john | 37 | 93 | 59 | 62 | 2013-01-14 20:26:25 
9 | steve | 85 | 71 | 87 | 74 | 2013-01-14 20:26:25 
...etc 

我需要一個查詢來發現誰的最大區別每個每天列。 (例如14日 - 史蒂夫有c1和c3增幅最大,約翰有c2,麥莉有c4)。每個人的數字都在不斷增加,因此可以假定任何人在任何一天的第一次入場時間總是少於他們當天的最後一次入場時間。

我已經嘗試了幾個小成功的查詢,並沒有太多的繼續,如果有人能夠至少指出我在正確的方向嗎?

理想情況下,所需的輸出將是包含名稱和差異增加幅度最大的每行數組。我不確定所有這些都可以在一個查詢中完成,但我真正需要的是每個專欄增加幅度最大的人員的姓名以及他們的區別。

擊穿

我需要搶在14日的第一和最後一個條目的每個人(ID:4至9);比較它們的c1值之間的差異,返回具有最大差異的人的姓名。重複c2,c3,& c4。


我至今感謝orangecrush,只是試圖獲得1列:(錯誤:無效使用組功能)

 "SELECT nm, diff_c1 FROM (
     SELECT NAME nm, MAX(c1) - MIN(c1) DIFF_C1 FROM TABLE AS a 
      WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY) 
      GROUP BY NAME) AS c 
     WHERE diff_c1 = (
     (SELECT max(MAX(c1) - MIN(c1)) FROM TABLE AS b 
     WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY) GROUP BY NAME) 
     )" 
+2

什麼是您想要的輸出? –

+0

我注意到,14日約翰在c1和c3上的差異最大。 – hjpotter92

+0

編輯我的問題,包括輸出,抱歉,如果我不清楚我不完全確定我需要在這裏使用什麼樣的查詢 –

回答

1

你可以試試這個:

SELECT nm, 'c1', diff_c1 
    FROM (SELECT NAME nm, MAX(C1) - MIN(C1) DIFF_C1 
      FROM TEST 
     WHERE trunc(TIME) = '14-JAN-2013' 
     GROUP BY NAME) 
WHERE diff_c1 = ((SELECT max(MAX(C1) - MIN(C1)) 
        FROM TEST 
        WHERE trunc(TIME) = '14-JaN-2013' 
        GROUP BY NAME)) 
union 
SELECT nm, 'c2', diff_c2 
    FROM (SELECT NAME nm, MAX(C2) - MIN(C2) DIFF_C2 
      FROM TEST 
     WHERE trunc(TIME) = '14-JaN-2013' 
     GROUP BY NAME) 
WHERE diff_c2 = ((SELECT max(MAX(C2) - MIN(C2)) 
        FROM TEST 
        WHERE trunc(TIME) = '14-JaN-2013' 
        GROUP BY NAME)) 
union 
SELECT nm, 'c3', diff_c3 
    FROM (SELECT NAME nm, MAX(C3) - MIN(C3) DIFF_C3 
      FROM TEST 
     WHERE trunc(TIME) = '14-JaN-2013' 
     GROUP BY NAME) 
WHERE diff_c3 = ((SELECT max(MAX(C3) - MIN(C3)) 
        FROM TEST 
        WHERE trunc(TIME) = '14-JaN-2013' 
        GROUP BY NAME)) 
union 
SELECT nm, 'c4', diff_c4 
    FROM (SELECT NAME nm, MAX(C4) - MIN(C4) DIFF_C4 
      FROM TEST 
     WHERE trunc(TIME) = '14-JaN-2013' 
     GROUP BY NAME) 
WHERE diff_c4 = ((SELECT max(MAX(C4) - MIN(C4)) 
        FROM TEST 
        WHERE trunc(TIME) = '14-JaN-2013' 
        GROUP BY NAME)) 

對日期進行了硬編碼。如果發現此查詢正在工作,則可以稍後動態調用它。我用來測試的表名:TEST。

+0

我需要選擇用戶對於特定日期的最大差異,而不是最大值列 –

+0

看到這個後刪除我的答案。我完全誤解了。我以爲他正在尋找*獨立*列之間的最大區別。 – hellohellosharp

+0

不是c1,c2,c3和c4的區別嗎?如果不是,那麼兩個實體之間有什麼區別呢?當你說,14日 - 史蒂夫c1和c3漲幅最大,約翰有c2,miley有c4)',我發現c1,c2,c3和c4的最大值是你的名字已經提到了這些列中的每一列。 – Orangecrush