我有一张这样的桌子
id, price, date
1, 200, 20180923
2, 100, 20180923
3, 300, 20180923
4, 300, 20180924
5, 200, 20180924
6, 100, 20180924
我想找到给定日期的最低价格,并检索ID。
所以SELECT id, MIN(price), date FROM table GROUP BY date
将返回每个日期的最低价格,但不会告诉我它属于哪个id
。
此处的预期输出为
2, 100, 20180923
6, 100, 20180924
答案 0 :(得分:2)
将其视为过滤而不是聚合。我会的:
select t.*
from t
where t.price = (select min(t2.price)
from t t2
where t2.date = t.date
);
这样做的好处是可以利用(date, price)
上的索引。
如果给定日期的最低价格重复,则会检索多行。
处理重复项的一种方法是将它们作为列表返回:
select t.date, min(t.price), group_concat(t.id) as ids
from t
where t.price = (select min(t2.price)
from t t2
where t2.date = t.date
)
group by date;
答案 1 :(得分:0)
找到每个日期的最低价格分组。将此表用作派生表并与原始表联接,以获得对应于最低价格的完整行。
请尝试以下操作:
Select t1.*
From your_table as t1
Inner join (select t2.date, min(t2.price) as min_price
From your_table as t2
Group by t2.date) as t3 on t3.date = t1.date and t3.min_price = t1.price