2015-06-23 51 views
0

我有以下數據集:Mysql的加入 - 基於兩個最大濾波器結果值

+----+------------+------+-------+----------+ 
| id | date | week | time | price | 
+----+------------+------+-------+----------+ 
| 1 | 2015-05-01 | 24 | 13:25 | 1.251325 | 
| 2 | 2015-05-01 | 24 | 14:25 | 1.251256 | 
| 3 | 2015-05-02 | 24 | 15:25 | 1.251715 | 
| 4 | 2015-05-02 | 24 | 16:25 | 1.251588 | 
| 5 | 2015-05-10 | 25 | 17:25 | 1.251347 | 
+----+------------+------+-------+----------+ 

我用下面的代碼來獲取最新的價格在每一天,它提供了完美的結果結束:

SELECT t.id, t.date, t.time, t.balance 
FROM db1 t JOIN 
(SELECT tt.date, MAX(tt.time) as 'maxtime' 
FROM db1 tt 
GROUP BY tt.date 
) m 
ON m.maxtime = t.time AND t.date = m.date; 

但是,現在我還想要查詢傳遞每週的最新價格。因此,我需要在每週內查找最新日期,然後查找最長時間。我想這樣的事情,但是這顯然是不正確的語法:

SELECT t.id, t.date, t.time, t.balance 
FROM db1 t JOIN 
(SELECT tt.date, MAX(tt.time) as 'maxtime' 
FROM db1 tt 
GROUP BY tt.date 
AND 
SELECT tt.week, MAX(tt.date) as 'maxdate' 
FROM db1 tt 
GROUP BY tt.week 
) m 
ON m.maxtime = t.time AND m.week = t.week AND m.maxdate = t.date; 

的問題是如何鏈接「分組依據」基於兩種不同的兩個條件。我正在尋找的結果應該如下所示:

+----+------------+------+-------+----------+ 
| id | date | week | time | price | 
+----+------------+------+-------+----------+ 
| 4 | 2015-05-02 | 24 | 16:25 | 1.251588 | 
| 5 | 2015-05-10 | 25 | 17:25 | 1.251347 | 
+----+------------+------+-------+----------+ 

非常感謝您提前給予您的幫助。

+0

作爲一個建議,MySQL有一個'DATETIME'對象可以用來避免有兩個單獨的列。 – AdamMc331

回答

2

奇怪的是看你有日期和時間的列,但也許這是必要的重複次數(每天11:00)或沒有時間的日期。否則,你應該使用日期時間。

您正在尋找的是最新的日期時間或一週內的時間戳。當你結合日期和時間時,你會得到這個。

SELECT t.id, t.date, t.time, t.balance 
FROM db1 t JOIN 
(SELECT tt.week, MAX(timestamp(tt.date,tt.time)) as 'maxtime' 
FROM db1 tt 
GROUP BY tt.week 
) m 
ON m.maxtime = timestamp(t.date,t.time) AND t.week = m.week; 
+0

我不知道'timestamp()'函數。這看起來比我的字符串連接更清潔。 – jpw

1

你可以串聯的日期和時間爲一個值,對這樣的應用最高:

SELECT t.id, t.date, t.week, t.time, t.price 
FROM db1 t 
JOIN (
    SELECT tt.week, MAX(concat(tt.date, ' ', tt.time)) as 'maxtime' 
    FROM db1 tt 
    GROUP BY tt.week 
) m ON m.maxtime = concat(t.date, ' ', t.time) and t.week = m.week; 

Sample SQL Fiddle

2

我建議做什麼,如果它不是你的日期和時間對象到一個DATETIME列組合的選擇,首先是研究TIMESTAMP()功能,可用於兩列轉換爲這樣一個DateTime對象:

SELECT TIMESTAMP(dateColumn, timeColumn) AS fullDate 
FROM myTable; 

一旦你有,你可以編寫一個查詢來獲取最大的DateTime每個星期,並加入回原來的表來獲得這樣的價值觀:

SELECT m.* 
FROM myTable m 
JOIN(
    SELECT week, MAX(TIMESTAMP(dateColumn, timeColumn)) AS latestDate 
    FROM myTable 
    GROUP BY week) mt ON mt.week = m.week AND mt.latestDate = TIMESTAMP(m.datecolumn, m.timecolumn); 

這裏是一個SQL Fiddle的例子。