MySql-选择MAX&;MIN并返回相应的行

MySql-选择MAX&;MIN并返回相应的行,mysql,Mysql,我试图在我的表格中获得最近6个月的最低和最高价格,并按月份分组显示。我的查询没有返回相应的行值,例如最高价格为或最低价格的日期时间 我想选择最低和最高价格以及它们发生的日期和时间,以及该行的其余数据。。。 (我之所以使用concat for report_term,是因为我需要在显示结果时将其与数据集一起打印。例如,2018年2月->…,2018年1月->…) 我举了一个例子,摘自我的数据库: 我期望的结果是看到最低和最高价格按月份、最低日期、最高日期分组。。都是在过去的6个月里 谢谢 更新。

我试图在我的表格中获得最近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