我有一张这样的桌子:
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分钟,则被认为是相同的进攻/犯规。因此,一个人可以在表中有多个条目,但它们可能属于同一违规/有多个条目,并且属于不同的违规。
理想情况下,我希望表看起来像这样:
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来做这样的事情呢?
发布于 2017-03-18 05:19:14
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
)
) ;https://stackoverflow.com/questions/42866499
复制相似问题