【发布时间】:2021-11-19 19:29:23
【问题描述】:
我想弄清楚满足一组条件的行数如何 随着时间的推移而改变。为此,我想计算 在开始日期满足条件,然后执行相同的计算 直到今天的每一天。我想要的输出表会 类似于下表(不包括未命名的列):
|------------+------------+----------------------------|
| | date | rows_staisfying_conditions |
|------------+------------+----------------------------|
| start date | 2021-09-01 | 2367 |
| | 2021-09-02 | 2784 |
| | 2021-09-03 | 3011 |
| | 2021-09-04 | 3601 |
| today | 2021-09-05 | 4155 |
|------------+------------+----------------------------|
生成上表的一种简单方法是每天有一个 CTE, 然后加入 CTE(见下面的代码)。问题是这很冗长而且 无法扩展。
WITH day0 AS (
SELECT count(*) AS day0
FROM (
SELECT DISTINCT account_id
FROM default_table
WHERE
secret_column = 'secret value'
AND lower(device_os) LIKE '%android%'
AND from_iso8601_timestamp(timestamp) < from_iso8601_timestamp('2021-09-01T00:00:00.0000000Z') + interval '0' day
)
),
day1 AS (
SELECT count(*) AS day1
FROM (
SELECT DISTINCT account_id
FROM default_table
WHERE
secret_column = 'secret value'
AND lower(device_os) LIKE '%android%'
AND from_iso8601_timestamp(timestamp) < from_iso8601_timestamp('2021-09-01T00:00:00.0000000Z') + interval '1' day
)
),
⋮
day4 AS (
SELECT count(*) AS day1
FROM (
SELECT DISTINCT account_id
FROM default_table
WHERE
secret_column = 'secret value'
AND lower(device_os) LIKE '%android%'
AND from_iso8601_timestamp(timestamp) < from_iso8601_timestamp('2021-09-01T00:00:00.0000000Z') + interval '4' day
)
),
SELECT *
FROM
day0
FULL JOIN day1 ON TRUE
FULL JOIN day2 ON TRUE
FULL JOIN day3 ON TRUE
FULL JOIN day4 ON TRUE
有人对我如何计算上表有什么建议吗? 可扩展的方式?
【问题讨论】:
标签: sql amazon-athena presto