2017-04-21 61 views
0

我有一個事件表與用戶關聯 我想知道是否有可能編寫一個SQL查詢,選擇創建事件的用戶,最後3個事件的狀態爲'取消」獲取最後5行的屬性,postgres

不計(),其中狀態= '取消',只有在最後3行不得不取消狀態

Select u.* from users AS u 
Right Join events as e ON e.user_id = u.id 
WHERE {last 3 rows have e.status = 'canceled'} 
Order by e.created_at 
Group by u.id 

事件表:

user_id, status, created_at 
1, 'canceled', 2017-04-21 
1, 'finished', 2017-04-20 
1, 'finished', 2017-04-19 
1, 'canceled', 2017-04-18 
1, 'canceled', 2017-04-17 
2, 'canceled', 2017-04-21 
2, 'canceled', 2017-04-20 
2, 'canceled', 2017-04-19 
2, 'finished', 2017-04-18 
2, 'finished', 2017-04-17 
+0

請張貼一些示例數據和預期輸出。 –

回答

3

您可以使用窗口功能獲取用戶列表。這裏有一種方法:

select e.user_id 
from (select e.*, 
      row_number() over (partition by e.user_id order by created_at desc) as seqnum 
     from event e 
    ) e 
where seqnum <= 3 and e.status = 'canceled' 
group by e.user_id 
having count(*) = 3; 

該查詢枚舉從最後的事件,然後統計被取消的數量。

回到users(或使用inexists),可以獲得更多用戶信息。

+0

它只會得到狀態=取消的事件? 或者它會得到最後3個被取消事件的user_id? – mikrafizik

+0

@mikrafizik。 。 。這將返回最後三個事件被取消的用戶。這檢查所有三個被取消。如果只有一個需要取消,請刪除'having'子句。 –

+0

太棒了,謝謝,我會在我的項目中檢查它 – mikrafizik