2017-10-06 78 views
0

我想給排名低於基於時間的數據(如果時間戳的區別是少了15分鐘,然後同級別其他等級+1) 如集團行列了基於某些條件

  • 時間: 06:10:32和06:12:38應該得到排名1
  • 時間:13:36:44和13:40:41和13:44:47應該得到排名2
  • 和最後4行應該得到等級3
user_id ride_id  createdat_local  
2681233 96783742 2017-10-04 06:10:32 
2681233 96784171 2017-10-04 06:12:38 
2681233 96924751 2017-10-04 13:36:44 
2681233 96925561 2017-10-04 13:40:41 
2681233 96926560 2017-10-04 13:44:47 
2681233 96994651 2017-10-04 18:12:29 
2681233 96995953 2017-10-04 18:18:16 
2681233 96996937 2017-10-04 18:22:15 
2681233 96997195 2017-10-04 18:24:00 
+0

你正在使用哪個dbms?不要標記不涉及的產品。 – jarlh

+0

是sql-server還是postgresql? –

+0

我刪除了不兼容的數據庫類型。請僅使用您真正使用的數據庫進行標記。 –

回答

2

在SQL Server 2012+:

common table expression使用窗函數lag()得到datediff()相比,createdat_local以前的行值,然後有條件聚集sum() over()生成排名:

;with cte as (
select * 
    , datediff(minute,lag(createdat_local) over (
     partition by user_id 
     order by createdat_local 
    ),createdat_local) as prev_dat 
from t 
) 
select user_id, ride_id, createdat_local 
    , sum(case when coalesce(prev_dat,16)>15 then 1 else 0 end) over (
    partition by user_id 
    order by createdat_local 
    ) as rank 
from cte 

rextester演示:http://rextester.com/EQUC48356

回報:

+---------+----------+---------------------+------+ 
| user_id | ride_id | createdat_local | rank | 
+---------+----------+---------------------+------+ 
| 2681233 | 96783742 | 2017-10-04 06:10:32 | 1 | 
| 2681233 | 96784171 | 2017-10-04 06:12:38 | 1 | 
| 2681233 | 96924751 | 2017-10-04 13:36:44 | 2 | 
| 2681233 | 96925561 | 2017-10-04 13:40:41 | 2 | 
| 2681233 | 96926560 | 2017-10-04 13:44:47 | 2 | 
| 2681233 | 96994651 | 2017-10-04 18:12:29 | 3 | 
| 2681233 | 96995953 | 2017-10-04 18:18:16 | 3 | 
| 2681233 | 96996937 | 2017-10-04 18:22:15 | 3 | 
| 2681233 | 96997195 | 2017-10-04 18:24:00 | 3 | 
+---------+----------+---------------------+------+ 
+0

感謝SqlZim,有了你的邏輯,我能夠在紅移 – user2207709

+0

@ user2207709中達到相同的結果樂意幫忙! – SqlZim

0

能夠取得在紅移(PSQL)所需的結果

查詢: 與CTE爲( 選擇*, (DATEPART( '小時',createdat_local)* 60 + DATEPART( '分鐘' ,createdat_local)) - 滯後(DATEPART( '小時',createdat_local)* 60 + DATEPART( '分鐘',createdat_local) )以上(通過createdat_local USER_ID順序分區)作爲diff_in_minutes 從噸 ) 選擇USER_ID,ride_id ,創建at_local ,sum(coalesce(diff_in_minutes,16)> 15 then 1 else 0 end時的情況)o ver( 分區由user_id 按無序前導和當前行之間創建的at_local行的順序排列爲 )作爲來自cte的排名爲 ;