我试图在我的表格中获取最近 6 个月的最小和最大价格,并按月将它们显示为一组。我的查询没有返回相应的行值,例如最高价或最低价的日期时间。
我想选择最低和最高价格及其发生的日期时间以及该行的其余数据... (我对 report_term 使用 concat 的原因,因为我需要在显示结果时将其与数据集一起打印。例如,2018 年 2 月 -> ....,2018 年 1 月 -> ...)
SELECT metal_price_id, CONCAT(MONTHNAME(metal_price_datetime), ' ', YEAR(metal_price_datetime)) AS report_term, max(metal_price) as highest_gold_price, metal_price_datetime FROM metal_prices_v2
WHERE metal_id = 1
AND DATEDIFF(NOW(), metal_price_datetime) BETWEEN 0 AND 180
GROUP BY report_term
ORDER BY metal_price_datetime DESC
我做了一个例子,从我的数据库中提取: http://sqlfiddle.com/#!9/617bcb2/4/0
我想要的结果是查看按月份、最低日期、最高日期......以及过去 6 个月内的所有价格分组的最低和最高价格。
谢谢
更新。 下面的代码有效,但它会返回超过指定 180 天的返回行。我刚刚检查过,这是因为它以多年来可能重复多次的价格加入....参见:http://sqlfiddle.com/#!9/5f501b/1
最佳答案
您可以在子选择上对最小值和最大值使用两次内部联接
select a.metal_price_datetime
, t1.highest_gold_price
, t1.report_term
, t2.lowest_gold_price
,t2.metal_price_datetime
from metal_prices_v2 a
inner join (
SELECT CONCAT(MONTHNAME(metal_price_datetime), ' ', YEAR(metal_price_datetime)) AS report_term
, max(metal_price) as highest_gold_price
from metal_prices_v2
WHERE metal_id = 1
AND DATEDIFF(NOW(), metal_price_datetime) BETWEEN 0 AND 180
GROUP BY report_term
) t1 on t1.highest_gold_price = a.metal_price
inner join (
select a.metal_price_datetime
, t.lowest_gold_price
, t.report_term
from metal_prices_v2 a
inner join (
SELECT CONCAT(MONTHNAME(metal_price_datetime), ' ', YEAR(metal_price_datetime)) AS report_term
, min(metal_price) as lowest_gold_price
from metal_prices_v2
WHERE metal_id = 1
AND DATEDIFF(NOW(), metal_price_datetime) BETWEEN 0 AND 180
GROUP BY report_term
) t on t.lowest_gold_price = a.metal_price
) t2 on t2.report_term = t1.report_term
关于MySql - 选择 MAX 和 MIN 并返回相应的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48889078/