基于日期序列排序的排名

3

我有以下数据

**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开始排名。

有人可以帮我吗?


2
难道不应该是1、1、1、2、3吗? - mu is too short
1
这里提供了一个 SQLFiddle 的示例数据:http://sqlfiddle.com/#!15/5f4f8。 - Craig Ringer
日期是否按照“标题”排序?每个“标题”下是否可以有多个日期? - Erwin Brandstetter
还有,结果中的最后一行与上面的示例相矛盾。 - Erwin Brandstetter
3个回答

3
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;

当您提到“rank”时,似乎希望得到窗口函数 row_number() 的结果。

  1. 在子查询 sub 中形成连续天数的组(grp 中相同日期)。
  2. 使用另一个 row_number() 调用对行进行编号,这次是按 grp 分区。

这里最少需要一个子查询,因为无法嵌套窗口函数。

SQL Fiddle.

请注意,我选择了您矛盾示例数据的第二个版本。结果与 @mu 在他的评论中建议的 相同。
同时假设没有重复的日期。在这种情况下,您需要先进行聚合。


0

嗨,这不是正确的答案,我正在尝试...很有趣..:) 我发布了我目前得到的内容:sqlfiddle

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

现在我正在尝试获取日期中的间断。我不知道怎么做?但也许这些链接有用:

如果我得到任何信息,我会更新的。

编辑:

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

给定一个具有两列i和j的表,生成一个结果集,其中包含一个派生的顺序行号列,该列按照j的定义排序,其值为1,2,3,...,当i的值更改时重置为1。


班加罗尔BLR - Bagmane Tech Park 2013-10-11数据中心0班加罗尔BLR - Bagmane Tech Park 2013-10-11 BMS 0班加罗尔BLR - Bagmane Tech Park 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,则排名应从2013-10-15重新开始为1 - user3007361

0

班加罗尔 BLR - 巴格曼技术园区 2013-10-11 数据中心 0 班加罗尔 BLR - 巴格曼技术园区 2013-10-11 BMS 0 班加罗尔 BLR - 巴格曼技术园区 2013-10-12 BMS 0 班加罗尔 BLR - 巴格曼技术园区 2013-10-15 BMS 3

我有这样的数据..

如果最后一列是零,则应基于所有列进行排名。如果日期连续,例如2013-10-11、2013-10-12,则排名应为1,2...

如果日期存在间断,例如2013-10-11、2013-10-12和2013-10-15,则排名应从2013-10-15开始重新计算为1


这可能应该是另一个问题(或对此问题的编辑),而不是答案。但在发布问题之前,请添加Postgres版本、表定义,并解释“应基于所有列进行制作”意味着什么。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接