我的数据如下
**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,......
任何人都可以帮我吗?
答案 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()
的结果。
grp
中形成连续日期(sub
中的相同日期)的组。row_number()
来电的号码行,这次按grp
分区。这里只有一个子查询,因为窗口函数不能嵌套。
请注意,我使用了您的矛盾样本数据的第二个版本。结果在他的评论中为@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开始