1

我正在尝试创建一个 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

WHERE我尝试了类似下面的方法,但 Teradata 尖叫“子句中不允许使用有序分析函数”。我已经拉了一段时间的头发,但没有取得太大进展。有人见过这个吗?

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

在此先感谢您的帮助!

4

3 回答 3

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

收藏它!:)

于 2010-07-09T15:22:43.607 回答
1
SELECT 
    user

FROM 
    visitstable

QUALIFY ROW_NUMBER() OVER (
    PARTITION BY 
        user
    ORDER BY 
        visit_date DESC) = 2

我从您的评论中看到,您不一定要依赖 Teradata-specific 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
于 2010-07-09T15:22:47.657 回答
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

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

于 2010-07-09T15:05:47.777 回答