Mysql - Мин и Макс в месяц в отличие от ежедневного?

0

Следующий запрос выполняет свою работу, чтобы выбрать минимальную, максимальную, стартовую и последнюю цену за день в данном месяце.

Я хотел бы выбрать то же самое, но в течение всего месяца, как показано в общей производительности за данный месяц, а не на ежедневной основе.

Сценарий: 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
  • 0
    Вы пробовали МЕСЯЦ ()
  • 0
    Можете ли вы добавить данные за более чем один месяц в скрипте sql?
Теги:
inner-join

1 ответ

0
Лучший ответ

Здесь запрос изменен для работы в течение каждого месяца. Я не изменил имена столбцов, поэтому вам, возможно, потребуется изучить это для лучшего обслуживания. Кроме того, я не тестировал это с данными в течение нескольких месяцев или более лет, поэтому вы должны это сделать, прежде чем начать использовать его.

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
  • 0
    нет минимальной даты и времени, максимальной даты и времени начала
  • 0
    У вас нет этого в запросе, который вы дали в качестве отправной точки в вопросе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню