基于日期顺序的排名

Posted

技术标签:

【中文标题】基于日期顺序的排名【英文标题】:Rank based on sequence of dates 【发布时间】:2013-11-19 04:58:10 【问题描述】:

我的数据如下

**Heading    Date**
A          2009-02-01
B          2009-02-03
c          2009-02-05
d          2009-02-06
e          2009-02-08

我需要排名如下

Heading    Date           Rank
A          2009-02-01      1
B          2009-02-03      2
c          2009-02-05      1
d          2009-02-06      2
e          2009-02-07      3

因为我需要基于日期的排名。如果日期是连续的,则排名应为 1、2、3 等。如果日期有任何中断,我需要从 1、2、... 重新开始

谁能帮我解决这个问题?

【问题讨论】:

不会是1、1、1、2、3吗? 此处将数据示例为 sqlfiddle:sqlfiddle.com/#!15/5f4f8。 日期是按照heading排序的吗?每个heading可以有多个日期吗? 另外,结果中的最后一行与上面的示例相矛盾。 请"Click a Tick" 接受答案,因为某个答案确实解决了您的问题,或者对找到您的解决方案最有帮助(注意:您可以再次单击以撤消)。接受答案表明问题已得到解决,这可以在寻找解决方案或寻找要解决的问题时节省其他人的时间。 【参考方案1】:
SELECT heading, thedate
      ,row_number() OVER (PARTITION BY grp ORDER BY thedate) AS rn
FROM  (
   SELECT *, thedate - (row_number() OVER (ORDER BY thedate))::int AS grp
   FROM   demo
   ) sub;

当您谈到“排名”时,您似乎想要窗口函数 row_number() 的结果。

    在子查询sub 中形成连续天数组(grp 中的同一日期)。 编号行与另一个row_number() 调用,这次由grp 分区。

这里只有一个子查询,因为窗口函数不能嵌套。

SQL Fiddle.

请注意,我使用了您的矛盾样本数据的第二个版本。结果与他的评论中的@mu suggested一样。 还假设没有重复的日期。在这种情况下,您必须先聚合。

【讨论】:

【参考方案2】:

您好,这不是正确的答案,我正在尝试.. 这很有趣..:) 我正在发布到目前为止的内容:sqlfiddle

SELECT
    rank() over (order by thedate asc) as rank,
    heading, thedate
FROM 
    demo
Order by
    rank asc;

现在我正在尝试中断日期。我不知道怎么办?但是这些链接可能有用吗

SQL — computing end dates from a given start date with arbitrary breaks How to rank in postgres query

如果有什么我会更新的。

编辑:

我为 mysql 得到了这个,我发布这个是因为它可能会有所帮助。检查Emulate Row_Number() 这里

给定一个包含两列 i 和 j 的表,生成一个包含 一个派生的顺序 row_number 列,取值 1,2,3,... j 的定义排序,当 i 的值改变时重置为 1

【讨论】:

班加罗尔 BLR - Bagmane 科技园 2013-10-11 数据中心 0 班加罗尔 BLR - Bagmane 科技园 2013-10-11 BMS 0 班加罗尔 BLR - Bagmane 科技园 2013-10-12 BMS 0 班加罗尔 BLR - Bagmane Tech Park 2013-10-15 BMS 3 我有这个数据。如果最后一列为零,则应根据所有列进行排名。如果日期是连续的,如 2013-10-11 ,2013-10 -12 排名应该是 1,2... 如果日期 2013-10-11 、2013-10-12 和 2013-10-15 再次出现任何中断,则排名应该从 1 开始到 2013-10-15跨度> 【参考方案3】:

班加罗尔 BLR - Bagmane 科技园 2013-10-11 数据中心 0 班加罗尔 BLR - Bagmane 科技园 2013-10-11 BMS 0 班加罗尔 BLR - Bagmane 科技园 2013-10-12 BMS 0 班加罗尔 BLR - Bagmane 科技园 2013-10-15 BMS 3

我有数据 lyk 这个..

如果最后一列为零,则应根据所有列进行排名。如果日期是连续的 比如 2013-10-11 ,2013-10-12 排名应该是 1,2...

如果日期 2013-10-11 、2013-10-12 和 2013-10-15 再次出现中断,则 2013-10-15 的排名应从 1 开始

【讨论】:

这应该是另一个问题(或对此问题的编辑),而不是答案。但在发布问题之前,请添加 Postgres 版本、表定义并解释 should be made based on all columns 的含义。

以上是关于基于日期顺序的排名的主要内容,如果未能解决你的问题,请参考以下文章

按排名按顺序设置字段,但在另一个字段的组中

排序顺序管理 - 不满意 SortOrder * 10^n 或链表实现

SQL Server - 如何将 RANK 函数插入到已按排名顺序排序的行中?

如何调整 Jekyll 发布顺序?

Azure 表存储:按顺序排列

Oracle 中基于两个日期的排名[关闭]