2015-06-20 73 views
1

我現在有一個具有以下佈局的價格表:MySQL查詢返回MIN()和不同列的MAX()爲多行

id codename price discount  timestamp 
1  1234  599  50   2015-06-10 00:00:00 
2  1234  1099  25   2015-06-11 00:00:00 
3  3344  199  33   2015-06-12 00:00:00 
4  5565  2499  0   2015-06-13 00:00:00 
5  5565  1299  50   2015-06-14 00:00:00 

我需要一個SQL查詢,這將使我的單行爲每個代碼名稱。每一行必須包含代號,然後以最低的價格(與相關的折扣和時間戳,這個價格一起),以及最新的時間戳(再次與相關的價格和折扣。時間戳)

所需的輸出:

codename minTimePrice minTimeDis minTime    latestPrice latestPriceDis latestPriceTime 
1234  599   50   2015-06-10 00:00:00 1099   25    2015-06-11 00:00:00 
3344  199   33   2015-06-12 00:00:00 199   33    2015-06-12 00:00:00 
5565  1299   50   2015-06-14 00:00:00 1299   50    2015-06-14 00:00:00 

編輯:所以我得到的地方,我可以有2個獨立的查詢,可以得到該行與MIN(價格),第二個獲得該行與MAX(時間戳),每個代號。

現在我需要做的是將它們連接在一起,以便它們都在同一行(按代號分組),如上例所示。

SQL Fiddle of 2 queries

+0

請問您可以給sqlfiddle鏈接 –

回答

0

嘗試以下,

Select codename, minPrice, minDis, minTime, latestPrice, latestDis, latestTime from 
(
    Select T_Low.codename, minPrice, minDis, minTime, T_Latest.latestPrice, T_Latest.latestDis, T_Latest.latestTime from 
    (
     select * from (
    select row_number() over(partition by codename order by codename, price) row_id, codename, price as minPrice, discount as minDis, timestamp as minTime from 
     (
     select codename, discount, timestamp , min(price) as price from prices 
     group by codename, discount, timestamp 
     )T 
     ) T1 
     where row_id = 1 
    ) T_Low 
    left join 
    (
     select * from (
    select row_number() over(partition by codename order by codename, timestamp desc) row_id, codename, price as latestPrice, discount as latestDis, timestamp as latestTime from 
     (
     select codename, discount, timestamp , min(price) as price from prices 
     group by codename, discount, timestamp 
     )T 
     ) T1 
     where row_id = 1 
    )t_Latest 
    ON T_Low.codename= T_Latest.codename and T_Low.row_id = T_Latest.row_id 
)T 
order by codename 
+0

如果您解釋爲什麼您的答案在原始不適用時可能會有所幫助 –

+0

在查詢中使用了原始查詢ID字段,而您想要執行分組時,總是唯一的必須被跳過。在查詢中不必要的加入。請參閱我已更新的答案,它適用於所需的輸出。 –

+0

以前的答案沒有被我檢查,只是基於假設,我已經測試過,你現在可以檢查它。 –

0

所以經過一番擺弄加入我能拿到2個查詢輸出到每代號爲單行:

SELECT * 
FROM 
(
    SELECT p.* 
    FROM prices p 
    JOIN 
    ( 
    SELECT codename, MIN(price) minPrice 
    FROM prices GROUP BY codename 
) p2 
    ON p.price = p2.minPrice AND p.codename = p2.codename 
) min 
LEFT JOIN 
(
    SELECT p.* 
    FROM prices p 
    JOIN 
    ( 
    SELECT codename, MAX(timestamp) maxTime 
    FROM prices GROUP BY codename 
) p2 
    ON p.timestamp = p2.maxTime AND p.codename = p2.codename 
) latest 
ON latest.codename = min.codename 

我我確信這個查詢並不完美,但它確實給了我正在尋找的結果。

SQL Fiddle

如果有什麼顯着錯,請讓我知道,我可以更新。