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

Mysql 如何使用sql按周获取滚动数据集,mysql,sql,database,dataset,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

我有一个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)
它看起来基本上是准确的,只是我注意到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')
假设您今天2017-01-06运行该数据,则该数据将返回旧查询(过去7天)相同数据点上的最后3行,但在新查询(星期日至星期六)相同数据点上仅返回最后2行

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


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

我不得不对您的问题进行多次解释,所以这个答案可能不合适。听起来,您正试图获得一个图表,显示历史上分组为7天周期的数据。您当前的尝试是按日历周分组,而不是按7天周期分组,这会导致周期大小不一致

因此,通过对sqlfiddle()上的数据集进行修改,我得出了以下结论

  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;

我不得不解释你的问题很多,所以这个答案可能不合适。听起来,您正试图获得一个图表,显示历史上分组为7天周期的数据。您当前的尝试是按日历周分组,而不是按7天周期分组,这会导致周期大小不一致

因此,通过对sqlfiddle()上的数据集进行修改,我得出了以下结论

  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;

既然有了您的查询,为什么您不能直接执行
select*from
order`?什么是“滚动数据集”?返回按周分组的数据。这样我就可以每周把它画出来。我将试图澄清这个问题,这是一个很好的观点。我可以提供准确的数据集或结构,但我编辑了我的答案,以展示如何演示问题。@我已经用一个真实的数据集更新了问题,该数据集将用于演示问题。这不就是来自的完整数据集吗?我建议提供一个明显小于17MB的示例数据集,以及一些示例SELECT查询/数据集。不完全确定您对开始/结束周还有什么期望,因为它们通常不包含7天,因此它们的总和较小。根据您的查询,为什么您不能只执行
select*from
order`?什么是“滚动数据集”?返回按周分组的数据。这样我就可以每周把它画出来。我将试图澄清这个问题,这是一个很好的观点。我可以提供准确的数据集或结构,但我编辑了我的答案,以展示如何演示问题。@我已经用一个真实的数据集更新了问题,该数据集将用于演示问题。这不就是来自的完整数据集吗?我建议提供一个明显小于17MB的示例数据集,以及一些示例SELECT查询/数据集。不完全确定您对开始/结束周还有什么期望,因为它们通常不包含7天,所以它们的总和较小。查询给了我奇怪的结果。
weeks\u ago
假设返回分数吗?啊,使用floor,如
floor(DATEDIFF(当前日期,订单日期)/7)中的floor,如weeks\u ago
导致了我所期望的准确行为。如果您同意,请将此编辑到您的问题中,我很乐意接受。你们很有耐心。对不起,我忘了用我的sqlfiddle的查询更新我的答案。作为将来的参考,使用SQL FIDLE提供复制标准,以及您希望数据看起来像什么的文本表示,可能比试图描述它更容易!这个查询给了我奇怪的结果。
weeks\u ago
假设返回分数吗?啊,使用floor,如
floor(DATEDIFF(当前日期,订单日期)/7)中的floor,如weeks\u ago
导致了我所期望的准确行为。如果您同意,请将此编辑到您的问题中,我很乐意接受。你们很有耐心。对不起,我忘了用我的sqlfiddle的查询更新我的答案。作为将来的参考,使用SQL FIDLE提供复制标准,以及您希望数据看起来像什么的文本表示,可能比试图描述它更容易!