【问题标题】:Presto SQL query that counts the number of rows, that satisfy a set of conditions, within arithmetically progressing time intervalsPresto SQL 查询,用于在算术渐进的时间间隔内计算满足一组条件的行数
【发布时间】: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


    【解决方案1】:

    您可以使用sum 窗口函数按日期分组并使用下一个frame 排序总和:

    WITH dataset (date, condition) AS
    (
      VALUES
      (date '2021-09-01', true),
      (date '2021-09-01', true),
      (date '2021-09-01', false),
      (date '2021-09-02', true),
      (date '2021-09-03', true)
    )
    
    SELECT date, sum(cnt) over (order by date range between unbounded preceding and current row) rows_staisfying_conditions
    FROM (
             SELECT date, sum(case when condition then 1 else 0 end) cnt
             FROM dataset
             GROUP BY date
         )
    

    输出:

    date rows_staisfying_conditions
    2021-09-01 2
    2021-09-02 3
    2021-09-03 4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2021-05-21
      相关资源
      最近更新 更多