MySql-选择MAX&;MIN并返回相应的行
我试图在我的表格中获得最近6个月的最低和最高价格,并按月份分组显示。我的查询没有返回相应的行值,例如最高价格为或最低价格的日期时间 我想选择最低和最高价格以及它们发生的日期和时间,以及该行的其余数据。。。 (我之所以使用concat for report_term,是因为我需要在显示结果时将其与数据集一起打印。例如,2018年2月->…,2018年1月->…) 我举了一个例子,摘自我的数据库: 我期望的结果是看到最低和最高价格按月份、最低日期、最高日期分组。。都是在过去的6个月里 谢谢 更新。MySql-选择MAX&;MIN并返回相应的行,mysql,Mysql,我试图在我的表格中获得最近6个月的最低和最高价格,并按月份分组显示。我的查询没有返回相应的行值,例如最高价格为或最低价格的日期时间 我想选择最低和最高价格以及它们发生的日期和时间,以及该行的其余数据。。。 (我之所以使用concat for report_term,是因为我需要在显示结果时将其与数据集一起打印。例如,2018年2月->…,2018年1月->…) 我举了一个例子,摘自我的数据库: 我期望的结果是看到最低和最高价格按月份、最低日期、最高日期分组。。都是在过去的6个月里 谢谢 更新。
下面的代码可以工作,但它返回的行超过了指定的180天。我刚刚检查过,这是因为它的价格可能会在几年内重复多次。。。。请参阅:您可以在子选择上使用两次内部联接来表示最小值和最大值
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
你应该做什么的简化版本,这样你就可以了解工作流程 您需要计算所需周期的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\u字段
是CONCAT()
值您在conditions@JuanCarlosOropeza…谢谢加入第二张桌子,谢谢!。但是,它只返回一行。。如何返回最近6个月的最小值和最大值以及相应的行?检查内部子查询是否返回6行。。并最终用适当的表格样本和预期的result@scaisEdge是,内部查询返回5行。。如何才能让整个查询返回行。。。
SELECT *
FROM ( .... ) as T1
JOIN ( .... ) as T2
ON t1.group_field = t2.group_field