我有一张非常大的桌子:user_id, started_at, ends_at, group_id
我需要对此进行一些分析,所以我试图预先计算一些值,在这个特定的情况下我想创建一个像这样的表:
active_in_week with id, user_id, active_week
其中active_week是started_at
和ends_at
之间的每周
因此,对于started_at
2017-01-01和ends_at
2017-01-31的行,结果将为4行:
id user_id, active_week
1, 1, 1
2, 1, 2
3, 1, 3
4, 1, 4
由于此表的大小/速度,我宁愿在查询级别而不是编程语言上执行此操作。目的是在每周聚合值之后再进行其他查询。
现在如果我在标准化状态下执行这些查询,它们会使用适当的索引运行最多8小时。
答案 0 :(得分:1)
你可能会像这样在外面工作(attn:它有点棘手):
CREATE TABLE weeks AS (
SELECT weekId, MIN(date) as starts_at, MAX(date) as ends_at
FROM (
SELECT
YEARWEEK(started_at) AS weekId,
started_at AS date,
FROM srctable
UNION
SELECT
YEARWEEK(ends_at) AS weekId,
ends_at AS date,
FROM srctable
)
GROUP BY weekId
)
然后你应该有一个知道你数据的所有周,开始和结束日期的表。
您可以在周表上进行加入。