Rank() 基于列条目,而数据按日期排序

Posted

技术标签:

【中文标题】Rank() 基于列条目,而数据按日期排序【英文标题】:Rank() based on column entries while the data is ordered by date 【发布时间】:2021-02-26 09:10:37 【问题描述】:

在数据按 time_id 排序后,我正在尝试在 pagename 列上使用 dense_rank() 函数。 排名列 rn 中的预期输出为:[1,2,2,3,4]。

目前我写成:

with tbl2 as 
(select UID, pagename, date_id, time_id, source--, dense_rank() over(partition by UID order by pagename) as rn 
 from tbl1
 order by time_id)

select *, dense_rank() over(partition by UID order by time_id, pagename) as rn
from tbl2 

任何帮助将不胜感激

编辑 1:我在这里想要实现的是根据用户屏幕上的操作流程对访问的页面进行排名。假设如果在访问不同的页面“B”后又访问了相同的页面“A”,那么这些页面访问 A、B、A 的排名将为 1、2、3(请注意,同一页面 A 具有不同的排名 1 和3)

【问题讨论】:

请以文本形式提供数据和表格结构,而不是图像。 @MarkRotteveel,我认为因为这适用于他们两个(因为我都使用过),所以我标记了这些。但是接受了你的建议并只标记了我用于此的 postgres @JimJones,我认为表列名足以满足此目的。并且代码是出于相同的目的共享的,也是为了展示我的工作 【参考方案1】:

step-by-step demo:db<>fiddle

SELECT 
    *, 
    SUM(is_diff) OVER (ORDER BY date_id, time_id, page) 
FROM (
    SELECT 
        *,
        CASE WHEN page = lag(page) over (order by date_id, time_id) THEN 0 ELSE 1 END as is_diff
    FROM mytable 
)s

这看起来就像我几年前问的一个问题:Window functions: PARTITION BY one column after ORDER BY another

您想在列(uuid, page) 上执行窗口函数,但又想保持由不相关列(date_id, time_id) 给出的当前顺序。

问题是,PARTITION BY 将记录排在ORDER BY 子句之前。所以,它定义了主顺序,这是不期望的。

一旦我找到了解决方案。我根据您的用例对其进行了调整。请看那边的解释:https://***.com/a/52439794/3984221

有趣的部分:查询中没有明确要求您的特殊 rank() 案例,因为我的解决方案创建了开箱即用的情况(“意外”可以这么说;))。

【讨论】:

看到你分享的帖子并理解代码。我认为这也应该解决我的问题。将适应这一点,让你知道。感谢您的参考帖子(Y)【参考方案2】:

嗯。 . .如果您希望页面按最早时间排序,则使用两级窗口函数:

select t.*,
       dense_rank() over (partition by uid order by min_rn, pagename) as ranking
from (select t.*,
             min(rn) over (partition by uid, pagename) as min_rn
      from t
     ) t

注意:这使用rn 作为方便的快捷方式,因为日期/时间分为两列。您也可以将它们组合起来:

select t.*,
       dense_rank() over (partition by uid order by min_dt, pagename) as ranking
from (select t.*,
             min(date_id || time_id) over (partition by uid, pagename) as min_dt
      from t
     ) t;

注意:此解决方案与 S_man 的解决方案不同。在您的样本数据上,他们做同样的事情。但是,如果用户返回一个页面,那么他会给页面一个新的排名。这使页面与第一次出现时的排名相同。不清楚你真正想要什么。

【讨论】:

我根据用户页面流操作给出排名。因此,如果用户在不同的页面访问后返回同一页面,那么尽管页面名称相同,但该页面访问的排名应该不同 会采纳您的建议,并在下次更具体。谢谢 @Aravind_005 。 . .在这种情况下,S-Man 的答案是最好的方法。您的问题并不清楚。【参考方案3】:

您可以像这样使用DENSE_RANK() 来满足您的要求,

  SELECT
     u_id,
     page_name,
     date_id,
     time_id,
     source,
     DENSE_RANK()
  OVER (
       PARTITION BY page_name
       ORDER BY u_id DESC
  ) rn 
  FROM ( SELECT * FROM tbl1 ORDER BY time_id ) AS result;

【讨论】:

以上是关于Rank() 基于列条目,而数据按日期排序的主要内容,如果未能解决你的问题,请参考以下文章

按日期和其他列计算最后一个条目

Pandas DataFrame 按分类列排序,但按特定类排序

MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询

如何使用 LINQ 从表中获取最新条目?

按核心数据中的日期组件获取条目

PostgreSQL 按日期过滤条目,但包括未包含日期为空的条目