Selecting first and last values in a group

前端 未结 4 1449
滥情空心
滥情空心 2020-12-08 14:42

I have a MySql table consisting of daily stock quotes (open, high, low, close and volume) which I\'m trying to convert into weekly data on the fly. So far, I have the follow

4条回答
  •  青春惊慌失措
    2020-12-08 14:52

    Starting with MySQL 8, you would ideally use window functions for the task:

    WITH 
      t1 AS (
        SELECT _low, _high, _volume, CONCAT(YEAR(_date), "-", WEEK(_date)) AS myweek
        FROM mystockdata
      ),
      t2 AS (
        SELECT 
          t1.*, 
          FIRST_VALUE(_open) OVER (PARTITION BY myweek ORDER BY _date) AS first_open,
          FIRST_VALUE(_close) OVER (PARTITION BY myweek ORDER BY _date DESC) AS last_close
        FROM t1
      )
    SELECT MIN(_low), MAX(_high), AVG(_volume), myweek, MIN(first_open), MAX(last_close)
    FROM t2
    GROUP BY myweek
    ORDER BY myweek;
    

提交回复
热议问题