问题描述
WITH conversions AS (
SELECT
*
FROM attribution a JOIN user_sessions u ON a.session_id = u.session_id
WHERE conversion = TRUE)
SELECT
user_id,**ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at END) AS rnk,**
channel
FROM attribution a JOIN user_sessions u ON a.session_id = u.session_id
WHERE user_id IN (SELECT disTINCT user_id FROM conversions)
**AND rnk = 1**
我的困惑在于以下两点: 1-如果Where子句首先运行,并且我们只有选择性的User_id可以运行row_number()分析函数。那么我们如何在这里使用rnk = 1 2-如果首先运行row_number(),则意味着它将对每个user_id进行排名,而与WHERE子句无关。这是正确的吗?
从以上两种说法中,哪种说法更有意义?
解决方法
从概念上讲,窗口函数只能看到在where
子句中过滤后 仍然保留的行。必然的结果是,您在此处尝试时不能在where
子句中使用window函数(这是语法错误)。
我根本看不到代码中的with
子句。大概,您想要的查询是:
select *
from (
select user_id,channel,row_number() over(partition by user_id order by created_at) rn
from attribution a
inner join user_sessions u on u.session_id = u.session_id
where conversion = true
) t
where rn = 1
我强烈建议在查询的每一列前添加其所属表的别名,以使查询对底层数据结构毫不含糊。