如何使用sql按周获取滚动数据集

时间:2017-01-06 14:36:30

标签: mysql sql database dataset

我有一个我会运行的SQL查询,它会获得滚动总和(或移动窗口)数据集。我会每7天运行一次这个查询,将间隔数增加7(下面的例子中为28),直到我到达数据的开头。它会给我按周分割的数据,这样我就可以在视图上循环显示它来创建每周图形。

  SELECT *
  FROM `table`
  WHERE `row_date` >= DATE_SUB(NOW(), INTERVAL 28 DAY)
  AND `row_date` <= DATE_SUB(NOW(), INTERVAL 28 DAY)

一旦你有数周的数据,这当然是非常缓慢的。我想用一个查询替换它。我想出了这个。

  SELECT *
  CONCAT(YEAR(row_date), '/', WEEK(row_date)) as week_date
  FROM `table`
  GROUP BY week_date
  ORDER BY row_date DESC

除了我注意到本周和2015年的最后一周比平常低得多之外,它看起来大部分是准确的。那是因为这个查询从星期日(或星期一?)开始一周,这意味着它每周重置一次。

以下是您可以用来演示行为的员工数据集。

CREATE TABLE employees (
    id          INT             NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    row_date    DATE            NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO `employees` VALUES
(1,'Bezalel','Simmel','2016-12-25'),
(2,'Bezalel','Simmel','2016-12-31'),
(3,'Bezalel','Simmel','2017-01-01'),
(4,'Bezalel','Simmel','2017-01-05')

此数据将返回旧查询(过去7天)上同一数据点的最后3行,假设您今天运行2017-01-06,但只有新数据点上的最后2行查询(周日至周六)。

有关滚动或移动窗口的含义的更多信息,请参阅此英文堆栈交换链接。

https://english.stackexchange.com/questions/362791/word-for-graph-that-counts-backwards-vs-graph-that-counts-forwards

如何在MySQL中编写一个能够为我提供滚动数据的查询,其中最后一个数据点是过去7天的数据,前一个点是前7天,依此类推?

1 个答案:

答案 0 :(得分:1)

我必须经常解释你的问题所以这个答案可能不合适。听起来你正试图得到一张图表,显示历史上分为7天的数据。您当前的尝试是通过在日历周进行分组而不是按照7天的时间段进行分组,从而导致期间大小不一致。

所以在sql小提琴(http://sqlfiddle.com/#!9/90f1f2)上使用数据集的修改我已经想到了这个

  SELECT 
    -- Figure out how many periods of 7 days ago this record applies to
    FLOOR( DATEDIFF( CURRENT_DATE , row_date ) / 7 ) AS weeks_ago,
    -- Count the number of ids in this group
    COUNT( DISTINCT id ) AS number_in_week,
    -- Because this is grouped, make sure to have some consistency on what we select instead of leaving it to chance
    MIN( row_date ) AS min_date_in_week_in_dataset 
  FROM `sample_data`
  -- Groups by weeks ago because that's what you are interested in
  GROUP BY weeks_ago
  ORDER BY 
    min_date_in_week_in_dataset DESC;