[英]SQL MIN(value) matching date
好了,我有一个表格,我需要从GROUP BY函数中获取相关日期...
Here is a sample of the data:
min_price, day
140000 2010-09-26
130000 2010-09-27
154991 2010-10-08
143000 2010-10-09
156470 2010-10-10
I would like this result:
130000 2010-09-27
143000 2010-10-09
Here is the SQL I use:
SELECT MIN(min_price) AS low_price, min_price, day
FROM compress
WHERE item_name = '$item'
GROUP BY EXTRACT(MONTH FROM day), EXTRACT(YEAR FROM day)
Here is what I get:
130000 2010-09-26
143000 2010-10-08
如您所见,日期与最小行值不匹配。 我需要他们配合。 我可以使用哪种SQL来获得该结果?
Select C.min_price, C.day
From compress As C
Where C.item_name = '$item'
And Exists (
Select 1
From compress As C2
Where C2.item_name = C.item_name
And Extract(Month From C2.day) = Extract(Month From C.day)
And Extract(Year From C2.day) = Extract(Year From C.day)
Group By Extract(Month From C2.day), Extract(Year From C2.day)
Having C.min_price = Min(C2.min_price)
)
加成
MySQL的联接更好,所以这是同一查询的变体
Select C.min_price, C.day
From compress As C
Join (
Select C2.item_name
, Extract(Month From C2.day) As ItemMonth
, Extract(Year From C2.day) As ItemYear
, Min(C2.min_price) As MinPrice
From compress As C2
Group By C2.item_num, Extract(Month From C2.day), Extract(Year From C2.day)
) As Z
On Z.item_name = C.item_name
And Z.ItemMonth = Extract(Month From C.day)
And Z.ItemYear = Extract(Year From C.day)
And Z.MinPrice = C.min_price
Where C.item_name = '$item'
真正减慢任何变化的是在每一行上调用Extract。 如果您有一个日历表,其中每个日期都包含一行,而该日期的月份和年份则包含一列,并且您的日历表涵盖了数据中的日期范围,那么您可以执行以下操作:
Select C.min_price, C.day
From compress As C
Join Calendar As Cal
On Cal.Date = C.Day
Join (
Select C3.item_name
, Cal3.Month, Cal3.Year
, Min(C3.min_price) As MinPrice
From compress As C3
Join Calendar As Cal3
On Cal3.Date = C3.day
Group By C3.item_num, Cal3.Month, Cal3.Year
) As Z
On Z.item_name = C.Item_name
An Z.Month = Cal.Month
And Z.Year = Cal.Year
And Z.MinPrice = C.min_price
Where C.item_name = '$item'
SELECT min_price AS low_price, min_price, day
FROM compress
WHERE item_name = '$item' AND min_price = MIN(min_price)
GROUP BY EXTRACT(MONTH FROM day), EXTRACT(YEAR FROM day)
然后,将选择min_price与MIN(min_price)相同的行
您的SQL无效。 分组时,显示列表中的每一列(不属于按表达式分组的一部分)都必须通过聚合函数传递,例如AVG(),MIN(),MAX(),但您只是要求“ day” 。
请用自然语言(英语)说明您要达到的目标。 您的例子并不十分清楚。
如果我正确理解了问题,则应该可以...
mysql> select * from stack;
+-----------+------------+
| min_price | myday |
+-----------+------------+
| 140000 | 2010-09-26 |
| 130000 | 2010-09-27 |
| 154991 | 2010-10-08 |
| 143000 | 2010-10-09 |
| 156470 | 2010-10-10 |
+-----------+------------+
5 rows in set (0.00 sec)
mysql> select a.* from stack as a inner join
-> (select min(min_price) as my_price from stack group by extract(YEAR_MONTH from myday)) as b
-> on a.min_price = b.my_price;
+-----------+------------+
| min_price | myday |
+-----------+------------+
| 130000 | 2010-09-27 |
| 143000 | 2010-10-09 |
+-----------+------------+
2 rows in set (0.00 sec)
您将需要加入主键,以避免意外的结果。 如果查询速度慢,请为subselect创建一个临时表,在其上建立索引,然后使用该表与主表联接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.