我有一个我会运行的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行查询(周日至周六)。
有关滚动或移动窗口的含义的更多信息,请参阅此英文堆栈交换链接。
如何在MySQL中编写一个能够为我提供滚动数据的查询,其中最后一个数据点是过去7天的数据,前一个点是前7天,依此类推?
答案 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;