基于日期顺序的排名
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 或链表实现