【问题标题】:MySql - Selecting MAX & MIN and returning the corresponding rowsMySql - 选择 MAX 和 MIN 并返回相应的行
【发布时间】:2018-07-31 00:58:26
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您应该做什么的简化版本,以便您了解工作流程。

    您需要计算所需期间的 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()

    【讨论】:

      【解决方案2】:

      您可以在最小和最大子选择上使用两次内连接

      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
      

      【讨论】:

      • 你错过了一些ON条件
      • @JuanCarlosOropeza ..感谢加入第二张桌子
      • 谢谢!。但是,它只返回一行。我如何返回过去 6 个月的相应行的最小值和最大值?
      • 检查内部子查询是否返回 6 行 .. 并最终使用适当的表格样本和预期结果更新您的问题
      • @scaisEdge 是的,内部查询确实返回 5 行。我怎样才能让整个查询返回行...
      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2021-11-05
      • 2015-07-04
      • 1970-01-01
      相关资源
      最近更新 更多