我试图获得表格中最低和最高价格的最后6个月,并按月分组显示。我的查询没有返回相应的行值,例如最高价格是或最小价格的日期时间。
我想选择min&最大价格和它们发生的日期时间以及该行的其余数据...... (之所以我为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
答案 0 :(得分:2)
您可以在subselect上使用两次内部连接,用于min和max
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
答案 1 :(得分:0)
您应该做的简化版本,以便您了解工作流程。
您需要计算所需时段的min()max()。这是你在这座建筑上的第一块砖。
你有tableA,你计算min()让我们称之为R1
SELECT group_field, min() as min_value
FROM TableA
GROUP BY group_field
同样的max()称之为R2
SELECT group_field, max() as max_value
FROM TableA
GROUP BY group_field
现在您需要从原始字段中提取所有数据,以便将每个结果与原始表格连接起来
我们称之为T1和T2:
SELECT tableA.group_field, tableA.value, tableA.date
FROM tableA
JOIN ( ... .. ) as R1
ON tableA.group_field = R1.group_field
AND tableA.value = R1.min_value
SELECT tableA.group_field, tableA.value, tableA.date
FROM tableA
JOIN ( ... .. ) as R2
ON tableA.group_field = R2.group_field
AND tableA.value = R2.max_value
现在我们加入T1和T2。
SELECT *
FROM ( .... ) as T1
JOIN ( .... ) as T2
ON t1.group_field = t2.group_field
所以我的想法是,如果你能做一块砖,你就可以做下一块砖。然后,您还可以添加过去6个月或其他所需的过滤器。
在这种情况下,group_field
是CONCAT()
值