首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql dense_rank操作

Postgresql dense_rank操作
EN

Stack Overflow用户
提问于 2017-03-18 04:22:33
回答 1查看 376关注 0票数 2

我有一张这样的桌子:

代码语言:javascript
复制
     Name     | Time  |  
     Sam      | 10:58 | 
     Sam      | 10:59 | 
     Sam      | 11:10 |   
     Tom      | 1:16  |   
     Tom      | 1:17  |   
     Tom      | 2:10  |  
     Tom      | 3:44  | 
     Tom      | 3:45  | 

所以基本上,它是一个表,记录一个人的活动,并显示活动的时间。出现在这个表格上的任何东西都是一种冒犯,它们通常被组合在一起,几乎没有什么信息。根据经验,如果活动的时间间隔不超过3分钟,则被认为是相同的进攻/犯规。因此,一个人可以在表中有多个条目,但它们可能属于同一违规/有多个条目,并且属于不同的违规。

理想情况下,我希望表看起来像这样:

代码语言:javascript
复制
 Name     | Time  | Infraction Number|  
 Sam      | 10:58 |         1        |
 Sam      | 10:59 |         1        |
 Sam      | 11:10 |         2        |  
 Tom      | 1:16  |         1        |  
 Tom      | 1:17  |         1        |  
 Tom      | 2:10  |         2        | 
 Tom      | 3:44  |         3        | 
 Tom      | 3:45  |         3        | 

有没有什么办法可以让我在postgresql中使用dense_rank来做这样的事情呢?

EN

回答 1

Stack Overflow用户

发布于 2017-03-18 05:19:14

代码语言:javascript
复制
SELECT Name,
       EXTRACT( HOUR FROM  time1 )||':'||EXTRACT( MINUTE FROM  time1 ) AS             Newtime ,       
       DENSE_RANK() OVER ( PARTITION BY name ORDER BY new_time ) AS Infraction_Number
  FROM
    (
        SELECT name,
               time1,             
               CASE WHEN ( EXTRACT( EPOCH FROM time1 ) - EXTRACT( EPOCH FROM time1_lag ) )/ 60 IS NULL OR 
                         ( EXTRACT( EPOCH FROM time1_lead ) - EXTRACT( EPOCH FROM time1 ) )/ 60 = 1 
                    THEN time1
                    WHEN ( EXTRACT( EPOCH FROM time1 ) - EXTRACT( EPOCH FROM time1_lag ) )/ 60 = 1
                    THEN time1_lag
                    WHEN ( EXTRACT( EPOCH FROM time1 ) - EXTRACT( EPOCH FROM time1_lag ) )/ 60 <> 1
                    THEN time1
                    WHEN ( EXTRACT( EPOCH FROM time1 ) - EXTRACT( EPOCH FROM time1_lag ) )/ 60 IS NULL OR
                         ( EXTRACT( EPOCH FROM time1_lead ) - EXTRACT( EPOCH FROM time1 ) )/ 60 = 1
                    THEN time1 
                END AS new_time                        
          FROM
            (
                SELECT name, 
                       time1, 
                       LAG( time1, 1) OVER ( PARTITION BY name ORDER BY time1 ) AS time1_lag,
                       LEAD( time1, 1) OVER ( PARTITION BY name ORDER BY time1 ) AS time1_lead
                  FROM Yourtable
            )  
    )   ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42866499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档