【问题标题】:snowflake-sql: case when min vs first_value windows functionsnowflake-sql:min vs first_value windows函数的情况
【发布时间】:2021-12-03 02:23:54
【问题描述】:

我希望有人可以提供帮助。假设我有这张桌子

sto_id pro_id o_date d_date
38 111 2021-04-01
30 111 2021-04-10 2021-04-10
30 222 2021-04-15
30 222 2021-04-18 2021-04-19
30 333 2021-04-20

而我想看到的结果是

first_sto_id pro_id min_o_date first_d_date
38 111 2021-04-01
30 222 2021-04-15 2021-04-19
30 333 2021-04-20

因此,如果 sto_id 为 30 并且 d_date 为空,我想要查看此 pro_id 的下一个 d_date(如果可用)。如果 sto_id 不是 30 那么 d_date 即使它是空的。

我试过这个:

select 
first_value(sto_id) OVER (PARTITION BY pro_id ORDER BY o_date ASC) as first_sto_id,
pro_id,
min(o_date) OVER (PARTITION BY pro_id ORDER BY o_date ASC) as min_o_date,
case when sto_id='30' then min(d_date) OVER (PARTITION BY pro_id ORDER BY o_date ASC)
else first_value(d_date) OVER (PARTITION BY pro_id ORDER BY o_date ASC) end as first_d_date
from tab1

但我没有得到我需要的结果。这里还有fiddle

有什么建议吗?? 提前非常感谢。

【问题讨论】:

    标签: sql case snowflake-cloud-data-platform window-functions min


    【解决方案1】:

    使用数组:

    -- PostgreSQL
    SELECT
     (ARRAY_AGG(sto_id ORDER BY o_date))[1] AS first_sto_id
    ,pro_id
    ,MIN(o_date) AS min_o_date
    ,CASE WHEN (ARRAY_AGG(sto_id ORDER BY o_date))[1] != '30'
               THEN (ARRAY_AGG(d_date ORDER BY o_date))[1]
          ELSE (ARRAY_REMOVE(ARRAY_AGG(d_date ORDER BY o_date),NULL))[1]
          END
    FROM tab1
    GROUP BY pro_id
    ORDER BY pro_id;
    

    db<>fiddle demo

    雪花版:

    SELECT
     (ARRAY_AGG(sto_id) WITHIN GROUP(ORDER BY o_date))[0]::int AS first_sto_id
    ,pro_id
    ,MIN(o_date) AS min_o_date
    ,CASE WHEN (ARRAY_AGG(sto_id) WITHIN GROUP(ORDER BY o_date))[0] != '30'
               THEN (ARRAY_AGG(d_date) WITHIN GROUP (ORDER BY o_date))[0]::date
          ELSE (ARRAY_COMPACT(ARRAY_AGG(d_date) WITHIN GROUP(ORDER BY o_date)))[0]::date
          END
    FROM tab1
    GROUP BY pro_id
    ORDER BY pro_id;
    

    相关:Equivalent for Keep in Snowflake

    【讨论】:

    • 嗨@Lukasz,我得到了这种格式“30”的first_sto_id,d_date也像这种“2021-04-19”。这可以避免吗?
    • @pooq Cast is required :: int/::date
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多