postgresql - 在同一 cte 中返回分区的 row_num()=1
问题描述
是否有更短的方法来过滤 rown_num = 1 上的 cte 而不是外部 where 子句?我隐约记得在 teradata 中使用“qualify”语句执行此操作。我可以在 Postgres 中使用更少的代码方式吗?
with
first_touch as (
select
l.session_id as last_session,
l.client_id,
f.session_id as first_session,
row_number() over(partition by f.client_id order by f.date asc) as rn
from ga_marketing.sessions l
join ga_marketing.sessions f on l.client_id = f.client_id
where l.date between '2021-06-01' and '2021-06-11'
)
select *
from first_touch
where rn = 1
我宁愿以某种方式在 cte 内过滤 rn=1 而不是在外面。这可能吗?有没有更短的方法来写我想要的?
解决方案
您需要至少两个级别的选择才能使用 Window 函数执行此操作。如果需要,您可以在 CTE 中执行两个级别,然后在 CTE 之外进行第三个虚拟选择,但我不明白这样做的意义何在,除了让虚拟选择看起来更干净(没有 WHERE 子句,没有列“rn”)。那部分会变短,但 CTE 会变长。或者您可以完全取消 CTE 并直接编写嵌套查询,我猜这在使用的数字击键中会“更短”。或者您可以将不同的片段封装到一个视图中,以隐藏某些级别。
我认为您也可以使用 DISTINCT ON 或 JOIN LATERAL 编写此代码,而不是使用窗口函数,但这似乎不是您要问的。
推荐阅读
- javascript - Javascript 排序对象键索引
- graphql - GraphQL 变量组合验证
- r - 传单标签是否支持“\n”换行符?
- python - 为什么在 node=None 不起作用时使用递归函数将“None”指定给节点?
- sql - 计算连续的 TRUE 值并在单独的列中显示为 TRUE 值的计数
- html - 如何使视频缩小以适合 HTML
- reactjs - React,如何在新标签页上打开 onclick 功能?
- javascript - 在 Officejs 加载项选择中访问原始日期值
- c++ - 如何使用 Range-v3 模拟 boost::algorithm::find_if_backward?
- css - 使三个 div(水平排列并嵌套在其他 div 中)具有相同的高度