【问题标题】:Mysql - Min and Max per month as oppose to daily?Mysql - 每月的最小值和最大值与每日相反?
【发布时间】:2018-02-23 15:00:14
【问题描述】:

下面的查询可以选择给定月份中每天的最低、最高、开始和最后价格。

我想为整个月选择相同的值,以显示给定月份的整体表现,而不是每天。

小提琴:http://sqlfiddle.com/#!9/ca4867/10

    SELECT maxminprice.metal_id, 
       maxminprice.metal_price_datetime_IST, 
       maxminprice.max_price, 
       maxminprice.min_price, 
       firstlastprice.first_price, 
       firstlastprice.last_price
FROM   (SELECT metal_id, 
               DATE(metal_price_datetime) metal_price_datetime_IST, 
               MAX(metal_price)           max_price, 
               MIN(metal_price)           min_price 
        FROM   metal_prices 
        GROUP  BY metal_id, 
                 DATE(metal_price_datetime) 
        ORDER  BY metal_id, 
                  DATE(metal_price_datetime_IST)) maxminprice 
       INNER JOIN (SELECT mp.metal_id, 
                          day_range.metal_price_datetimefl, 
                          SUM(CASE 
                                WHEN TIME(mp.metal_price_datetime_IST) = first_time 
                              THEN 
                                mp.metal_price 
                                ELSE NULL 
                              END) first_price, 
                          SUM(CASE 
                                WHEN TIME(mp.metal_price_datetime_IST) = last_time 
                              THEN 
                                mp.metal_price 
                                ELSE NULL 
                              END) last_price 
                   FROM   metal_prices mp 
                          INNER JOIN (SELECT metal_id, 
                                             DATE(metal_price_datetime_IST) 
                                             metal_price_datetimefl, 
                                             MAX(TIME(metal_price_datetime_IST)) 
                                             last_time, 
                                             MIN(TIME(metal_price_datetime_IST)) 
                                             first_time 
                                      FROM   metal_prices 
                                      GROUP  BY metal_id, 
                                                DATE(metal_price_datetime_IST)) 
                                     day_range 
                                  ON mp.metal_id = day_range.metal_id 
                                     AND DATE(mp.metal_price_datetime_IST) = 
                                         day_range.metal_price_datetimefl 
                                     AND TIME(mp.metal_price_datetime_IST) IN 
                                         ( last_time, first_time ) 
                   GROUP  BY mp.metal_id, 
                             day_range.metal_price_datetimefl) firstlastprice 
               ON maxminprice.metal_id = firstlastprice.metal_id 
                  AND maxminprice.metal_price_datetime_IST = 
                      firstlastprice.metal_price_datetimefl
                  AND maxminprice.metal_price_datetime_IST BETWEEN '2018-02-01' AND LAST_DAY('2018-02-01')
                      ORDER BY  metal_id, metal_price_datetime_IST DESC

【问题讨论】:

  • 你试过MONTH()
  • 可以在sql fiddle中添加超过一个月的数据吗?

标签: mysql inner-join


【解决方案1】:

这是更改为每个月都可以使用的查询。我没有更改列名,因此您可能需要考虑这样做以获得更好的维护。此外,我已经几个月或多年没有使用数据对此进行过测试,因此您应该在开始使用它之前进行测试。

SELECT maxminprice.metal_id, 
       maxminprice.metal_price_datetime_IST, 
       maxminprice.max_price, 
       maxminprice.min_price, 
       firstlastprice.first_price, 
       firstlastprice.last_price
FROM   (SELECT metal_id, 
               DATE_FORMAT(metal_price_datetime_IST, "%Y%m")  metal_price_datetime_IST, 
               MAX(metal_price)           max_price, 
               MIN(metal_price)           min_price 
        FROM   metal_prices 
        GROUP  BY metal_id, 
                 DATE_FORMAT(metal_price_datetime_IST, "%Y%m") 
        ORDER  BY metal_id, 
                  DATE_FORMAT(metal_price_datetime_IST, "%Y%m")) maxminprice 
       INNER JOIN (SELECT mp.metal_id, 
                          day_range.metal_price_datetimefl, 
                          SUM(CASE 
                                WHEN mp.metal_price_datetime_IST = first_time 
                              THEN 
                                mp.metal_price 
                                ELSE NULL 
                              END) first_price, 
                          SUM(CASE 
                                WHEN mp.metal_price_datetime_IST = last_time 
                              THEN 
                                mp.metal_price 
                                ELSE NULL 
                              END) last_price 
                   FROM   metal_prices mp 
                          INNER JOIN (SELECT metal_id, 
                                             DATE_FORMAT(metal_price_datetime_IST, "%Y%m") 
                                             metal_price_datetimefl, 
                                             MAX(metal_price_datetime_IST) 
                                             last_time, 
                                             MIN(metal_price_datetime_IST)
                                             first_time 
                                      FROM   metal_prices 
                                      GROUP  BY metal_id, 
                                                DATE_FORMAT(metal_price_datetime_IST, "%Y%m")) day_range 
                                  ON mp.metal_id = day_range.metal_id 
                                     AND DATE_FORMAT(mp.metal_price_datetime_IST, "%Y%m") = 
                                         day_range.metal_price_datetimefl 
                                     AND mp.metal_price_datetime_IST IN 
                                         ( last_time, first_time ) 
                   GROUP  BY mp.metal_id, 
                             day_range.metal_price_datetimefl) firstlastprice 
               ON maxminprice.metal_id = firstlastprice.metal_id 
                  AND maxminprice.metal_price_datetime_IST = 
                      firstlastprice.metal_price_datetimefl

【讨论】:

  • 没有最小日期时间、最大日期时间和开始日期
  • 您在查询中没有将其作为问题的起点。
  • 谢谢,我提出了一个新问题,这应该是最后一个了...stackoverflow.com/questions/49036591/…
猜你喜欢
  • 2012-03-13
  • 2016-09-18
  • 2014-10-17
  • 2023-04-10
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2015-01-09
  • 2015-07-04
相关资源
最近更新 更多