通過

2016-09-21 83 views
1

在組中選擇附加列值請參閱下面的mysql表數據。我想要做的是每個日期都有MIN(價格),但也要選擇匹配的some_id。通過

SELECT date, MIN(price), some_id 
FROM table 
GROUP BY date 

這不起作用,因爲mysql 5.7引入了完整的分組模式,因爲它是默認的。

任何想法?請注意,這是一個擁有數百萬行的巨大表格。

date  price some_id 
2016-04-09 10.66 3535475 
2016-04-09 11.53 2429075 
2016-04-09 11.53 2119575 
2016-04-09 12.53 1431700 
2016-04-09 12.55 2119375 
2016-04-10 8.58 885050 
2016-04-10 13.20 3535475 
2016-04-10 14.27 2429075 
2016-04-10 14.27 2119575 
2016-04-10 14.70 13591 
2016-04-11 11.98 885050 
2016-04-11 12.44 2119375 
2016-04-11 13.00 3535475 
2016-04-11 13.79 2119575 
2016-04-11 14.27 2429075 
2016-04-11 14.91 13409 
2016-04-11 15.38 2152375 
2016-04-11 15.64 1431700 
+0

是表格數據還是當前結果還是想要的結果?我們需要他們! – jarlh

+0

這是表格數據。想要的結果是每個'日期'一行,'MIN(價格)'+匹配'some_id' –

回答

2

使用查詢作爲派生表和JOIN回到原來的表試圖讓申請some_id還有:

SELECT t1.date, t1.price, t1.some_id 
FROM table t1 
JOIN (
    SELECT date, MIN(price) as min_price 
    FROM table 
    GROUP BY date 
) t2 ON t1.date = t2.date AND t1.price = t2.min_price 
+0

謝謝!這(幾乎)做了我想要的事情。只需要添加一個'SELECT DISTINCT'。 –

0

以供將來參考,full_group_by模式被默認執行的是什麼,會幫助你寫出更兼容SQL數據庫查詢。例如,它在PostgreSQL上默認也是強制執行的。

你可以用兩種方法做你想做的事。第一種是僅僅通過使用WHERE限制你的數據彙總之前設置:

SELECT date, MIN(price) FROM table WHERE some_id = [YOUR ID HERE] GROUP BY date 

第二種是通過HAVING選擇您some_id你已經做了彙總後:

SELECT some_id, date, MIN(price) FROM table GROUP BY some_id, date HAVING some_id = [YOUR ID HERE] 

Here's a good answer describing the difference between WHERE and HAVING

0

如果你得到的groupping第一,然後執行類似

SELECT t.some_id, xxx.`date`, xxx.minprice 
from table t join (
SELECT date, MIN(price) as minprice 
FROM table 
GROUP BY date) xxx on t.date = xxx.date; 
聯接
0

來源MySQL 5.7 Reference Manual - 13.20.3 MySQL Handling of GROUP BY

可以達到相同的E在不禁用ONLY_FULL_GROUP_BY 的情況下,使用ANY_VALUE()來引用非聚合列。

這樣:

SELECT date, MIN(price), ANY_VALUE(some_id) 
FROM table 
GROUP BY date 
+0

「ANY_VALUE」返回的結果是非確定性的。因此,它不能用來獲得所需的'some_id'值。 –

+0

@GiorgosBetsos糾正我,如果我錯了,但它是原始的'GROUP BY'查詢也是'some_id'字段的非確定性。我對OP問題的理解是,他不想(或不能)更改服務器上的「ONLY_FULL_GROUP_BY」模式,但仍希望獲得其非確定性結果,即ANY_VALUE()基本允許的結果。 –

+0

是的,這是正確的。 「ANY_VALUE」實質上掩蓋了「ONLY_FULL_GROUP_BY」模式。但是OP似乎想要*匹配*'some_id'值,即具有最小'價格'值的記錄的值。 –

0

這應該工作:

SELECT date, MIN(price), some_id 
FROM table 
GROUP BY date 
HAVING some_id='search id' 

HAVING條款適用於團體。