snowflake-sql:min vs first_value windows函数的情况
Posted
技术标签:
【中文标题】snowflake-sql:min vs first_value windows函数的情况【英文标题】:snowflake-sql: case when min vs first_value windows function 【发布时间】: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
有什么建议吗?? 提前非常感谢。
【问题讨论】:
【参考方案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以上是关于snowflake-sql:min vs first_value windows函数的情况的主要内容,如果未能解决你的问题,请参考以下文章
打开 bootstrap.min.css 崩溃 VS2010
VS2015--win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突
计算性能 scipy weibull min fit vs Matlab wblfit
VS2015--win32工程配置的一些想法之GdiplusTypes.h(470) : error C3861: 'min': identifier not found