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

时间:2018-02-20 15:47:51

标签: mysql

我试图获得表格中最低和最高价格的最后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

2 个答案:

答案 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_fieldCONCAT()