【发布时间】:2017-05-21 08:20:15
【问题描述】:
我有一个要运行的 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')
假设您在 2017 年 1 月 6 日今天运行,此数据将返回旧查询(过去 7 天)同一数据点的最后 3 行,但新查询仅返回同一数据点的最后 2 行查询(周日到周六)。
有关滚动或移动窗口的含义的更多信息,请参阅此英文堆栈交换链接。
如何在 MySQL 中编写一个查询,它会为我带来滚动数据,其中最后一个数据点是最近 7 天的数据,前一个点是前 7 天,依此类推?
【问题讨论】:
-
鉴于您的查询,您为什么不能只做
select * fromorder`?什么是“滚动数据集”? -
返回按周分组的数据。这样我就可以每周绘制它。我会尽量澄清这个问题。
-
@Strawberry 好点。我可以提供确切的数据集或结构,但我编辑了我的答案以展示如何证明这个问题。
-
@Strawberry 我已经用一个真实的数据集更新了这个问题,可以用来证明这个问题。
-
这不只是来自sink.agiletoolkit.org/employees 的完整数据集吗?我可以建议提供一个明显小于 17MB 的示例数据集以及一些示例 SELECT 查询/数据集。不完全确定您对开始/结束周还有什么期望,因为它们通常不包含 7 天,因此它们的总和会更小。
标签: mysql sql database dataset