SQL 最近在分区上使用 row_number()

Posted

技术标签:

【中文标题】SQL 最近在分区上使用 row_number()【英文标题】:SQL most recent using row_number() over partition 【发布时间】:2014-12-10 13:57:17 【问题描述】:

我正在处理一些网络点击数据,我只是在寻找最近的 page_name 以及访问的 user_id(按时间戳)。使用下面的代码,重复 user_id 并显示 page_name,并按降序排列。但是,我希望 recent_click 始终 = 1。完成时的查询将用作更大查询中的子查询。

这是我当前的代码:

 SELECT user_id,
 page_name,
 row_number() over(partition by session_id order by ts desc) as recent_click
 from clicks_data;

 user_id |  page_name  |  recent_click
 --------+-------------+--------------
 0001    |  login      |  1
 0001    |  login      |  2
 0002    |  home       |  1

【问题讨论】:

请显示样本数据@Kraut 您可以将查询移动到子查询中并添加where recent_clicks = 1 @sgeddes 成功了。谢谢! 【参考方案1】:

您应该能够将查询移动到子查询并添加where 条件:

SELECT user_id, page_name, recent_click
FROM (
  SELECT user_id,
         page_name,
         row_number() over (partition by session_id order by ts desc) as recent_click
  from clicks_data
) T
WHERE recent_click = 1

【讨论】:

【参考方案2】:

您应该将row_number() 函数移动到子查询中,然后在外部查询中对其进行过滤。 像这样的:

SELECT * FROM (
    SELECT
         [user_id]
        ,[page_name]
        ,ROW_NUMBER() OVER (PARTITION BY [session_id] 
                            ORDER BY [ts] DESC) AS [recent_click]
    FROM [clicks_data]
)x 
WHERE [recent_click] = 1

【讨论】:

以上是关于SQL 最近在分区上使用 row_number()的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:row_number 分区不重置计数器

分区上的递归 CTE 或 ROW_NUMBER?

ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

SQL Server中row_number函数用法介绍

T-SQL 中的数据透视表分区

sql 在 spark sql 数据帧查询中使用分区