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

5min+ 设计模式的迷惑?Provider vs Factory

模板:强连通分量&2-sat