根据日期顺序排名

时间:2013-11-19 04:58:11

标签: sql postgresql window-functions row-number

我的数据如下

**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,......

任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:2)

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()的结果。

  1. 在子查询grp中形成连续日期(sub中的相同日期)的组。
  2. 另一个row_number()来电的号码行,这次按grp分区。
  3. 这里只有一个子查询,因为窗口函数不能嵌套。

    SQL Fiddle.

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

答案 1 :(得分: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的表,生成一个具有的结果集   一个派生的顺序row_number列,取值1,2,3,... for   j的定义排序,当i的值改变时,它重置为1

答案 2 :(得分:0)

班加罗尔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开始