【发布时间】:2020-01-17 23:17:01
【问题描述】:
所以我有一个网站上的页面点击表,对于特定类型的每个页面 (marketing_page),我试图识别客户点击的下一页。所以我的查询可能看起来像这样
Select * from
(
Select page_id
, hit_time
, customer_id
, session_id
, page_type
, LEAD(page_id, 1) over (PARTITION BY customer_id, session_id ORDER BY hit_time) as next_page_id
FROM page_hits
)
WHERE page_type = 'marketing_page'
这种方法的问题是如果我将WHERE 子句保留在子查询之外,子查询就会变得巨大。理想情况下,我希望能够执行以下操作:
Select page_id
, hit_time
, customer_id
, session_id
, page_type
, LEAD(page_id, 1) over (PARTITION BY customer_id, session_id ORDER BY hit_time) as next_page_id
FROM page_hits
WHERE page_type = 'marketing_page'
但在执行LEAD 函数时,它仍会考虑WHERE 子句之外的页面。我知道LEAD 函数在WHERE 之后被评估,所以这是不可能的。
由于效率问题,我还想避免自加入。有没有一种快速/简单的方法来实现这一点?
谢谢!
【问题讨论】:
-
您是否遇到了特定的性能问题? SQL 是一种声明性语言,因此子查询可能不会在处理 where 之前完成评估。
-
这正是问题所在。在能够评估子查询之前超时。
-
您使用的是 Postgres 还是 Redshift?它们是非常不同的数据库(即使曾几何时代码库相似)。
-
对不起,应该已经澄清,使用红移
-
派生表对性能没有任何影响,在这种情况下,它只是语法糖。
标签: sql amazon-redshift