2017-08-30 1 views
2

Ich habe eine Abfrage, die lautet:Limit 3 Zeilen pro Benutzer-ID

SELECT users.id, users.name, messages.id, messages.name 

FROM messages 
INNER JOIN users on messages.user_id = users.id 

WHERE users.active = true 

ORDER BY users.id, messages.sent_at 

Was ich will, ist für die Abfrage der ersten 3 Zeilen für jeden users.id zurückzukehren, ist es möglich?

Ich habe keine ähnliche Frage in Stackoverflow oder einer anderen Website gefunden. Ich freue mich über jede Antwort oder hilfreiche Verbindung. Dank

Antwort

4

Sie row_number() innerhalb einer Unterabfrage/abgeleitete Tabelle verwenden können:

select users_id, users_name, messages_id, messages_name 
from (
    SELECT users.id as users_id, users.name as users_name, messages.id as messages_id, messages.name as messages_name, messages.sent_at 
    , row_number() over (partition by users.id order by messages.sent_at) as rn 
    FROM messages 
    INNER JOIN users on messages.user_id = users.id 
    WHERE users.active = true 
) as sub 
where rn < 4 
ORDER BY users_id, sent_at 
+0

Danke, @SqlZim! Ich wusste, dass die Antwort etwas mit Windows-Funktionen sein würde, wusste aber nicht genau, wie es geht. – Erick

+0

@Erick Glücklich zu helfen! – SqlZim