我正在尝试制作Teradata SQL查询,该查询将返回每个用户的 n - 按时间顺序访问的日期。如,
user | visit_date
---------------------
a 1/1
b 1/10
c 1/20
a 1/3
a 1/4
b 1/5
c 1/15
b 1/9
> magic_query_for_Second_visit;
user | second
------------------
a 1/3
b 1/9
c 1/20
我尝试了类似下面的内容,但Teradata尖叫说“WHERE
条款中不允许使用有序分析函数。”我已经把头发拉了一会但是没有取得多大进展。有谁见过这个?
select user,
row_number() over (partition by user order by visit_date desc) as rnum
from visitstable
where rnum = 2
如果我排除where
,那么我的结果看起来很有希望......我无法提取我需要的东西!
user | visit_date | rnum
---------------------------
a 1/1 1
a 1/3 2
a 1/4 3
b 1/5 1
b 1/9 2
b 1/10 3
c 1/15 1
c 1/20 2
提前感谢您的帮助!
答案 0 :(得分:1)
哦,天堂禁止我应该查看文档。仅供参考,看起来qualify
允许您指定有序的分析约束。但是,qualify
不是ANSI,所以我仍在为便携式解决方案分发点......
我能做到:
select user,
row_number() over (partition by user order by visit_date desc) as rnum
from visitstable
qualify rnum=2
......得到......
user | visit_date | rnum
-----------------------------
a 1/3 2
b 1/9 2
c 1/20 2
收藏它! :)
答案 1 :(得分:1)
SELECT
user
FROM
visitstable
QUALIFY ROW_NUMBER() OVER (
PARTITION BY
user
ORDER BY
visit_date DESC) = 2
我从您的评论中看到,您不一定要依赖Teradata特定的QUALIFY
。以下是一种便携式解决方案(正如许多RDBMS现在支持CTE)基于另一个小伙伴的答案:
WITH tmp (user, rnum) AS (
SELECT
user,
ROW_NUMBER() OVER (
PARTITION BY
user
ORDER BY
visit_date DESC) AS rnum
FROM
visitstable)
SELECT
tmp.*
FROM
tmp
WHERE
tmp.rnum = 2
答案 2 :(得分:0)
您使用的是哪个版本的SQL?它看起来像是MS SQL Server的更高版本,所以尝试使用像这样的“公用表表达式”......
with cte as (
select user,
row_number() over (partition by user order by visit_date desc) as rnum
from visitstable
)
select * from cte
where rnum = 2
语法可能需要稍微调整,但这是一般原则。