没有分区SQLite中的排名:需要仿真

时间:2014-11-23 12:39:25

标签: sql sqlite analytics

我想在sqlite3中对一天,时间表进行排名,并且缺乏一些分析功能。 下表

Day        | Time
--------------------------------
2014-10-27 | 2014-10-27 08:46:48
2014-10-28 | 2014-10-28 08:02:42
2014-10-30 | 2014-10-29 08:35:11
2014-10-30 | 2014-10-30 08:20:35
2014-10-31 | 2014-10-31 08:18:13
2014-10-31 | 2014-10-31 18:12:06
2014-11-03 | 2014-11-03 10:35:45
2014-11-03 | 2014-11-04 08:26:26
2014-11-03 | 2014-11-05 08:13:15
2014-11-03 | 2014-11-07 08:06:32    

我希望得到一个结果,其中列的升序排名按日划分类似:

Day        | Time                |Rank
-----------+---------------------+-----
2014-10-27 | 2014-10-27 08:46:48 | 1
2014-10-28 | 2014-10-28 08:02:42 | 1
2014-10-30 | 2014-10-29 08:35:11 | 2
2014-10-30 | 2014-10-30 08:20:35 | 1
2014-10-31 | 2014-10-31 08:18:13 | 2
2014-10-31 | 2014-10-31 18:12:06 | 1
2014-11-03 | 2014-11-03 10:35:45 | 4
2014-11-03 | 2014-11-04 08:26:26 | 3
2014-11-03 | 2014-11-05 08:13:15 | 2
2014-11-03 | 2014-11-07 08:06:32 | 1

我正在测试一些关于我在这里找到的SQLite Rank的想法

select p1.*, 
  ( select count(*) 
     from table as p2
    where p2.time> p1.time
    ) as timeRank
from table as p1

但他们主要是因为订购的Rank不适合我。

我在SQL Fiddle上有一个样本,我试图解决这个问题。

有没有办法在sqlite中解决这个问题,或者最好在Perl / Python中处理这个问题?

1 个答案:

答案 0 :(得分:5)

你很亲密。您需要在日期上使用条件并使用>=进行比较:

select p1.*, 
       (select count(*) 
        from table as p2
        where p2.date = p1.date and
             p2.time >= p1.time
       ) as timeRank
from table as p1;

严格地说,这更接近于dense_rank(),但除非您有重复的值,否则差异并不重要。如果你有联系,那么以下内容应该有效:

select p1.*, 
       (select 1 + count(*) 
        from table as p2
        where p2.date = p1.date and
             p2.time > p1.time
       ) as timeRank
from table as p1;