第n个结果是Teradata结果

时间:2010-07-09 14:59:01

标签: sql teradata

我正在尝试制作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

提前感谢您的帮助!

3 个答案:

答案 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

语法可能需要稍微调整,但这是一般原则。