2016-07-26 51 views
2

我複製了此幫助帖子的邏輯Grouped LIMIT in PostgreSQL: show the first N rows for each group?以按創建日期排序得到組的前N行。不過,我真的只對具有最小行數的高容量用戶感興趣。這是否必須作爲一組兩個不同的查詢來完成,或者我可以在下面修改我的查詢嗎?Postgres:每組返回前N行,用於具有最小計數的組

SELECT userid, createdat, displaydate 
FROM 
    (SELECT ROW_NUMBER() OVER 
     (PARTITION BY userid ORDER BY createdat) as r, 
      t.* FROM data t) x 
WHERE x.r <=100 

尤其是我嘗試以下,這導致了一個錯誤:

SELECT userid, createdat, displaydate 
FROM 
    (SELECT ROW_NUMBER() OVER 
     (PARTITION BY userid ORDER BY createdat) as r, 
      t.* FROM data t) x 
WHERE x.r <=100 
HAVING COUNT(*) > 100 

理想我會得到每個用戶的前100行對於那些誰至少有100行數據的用戶。 我該如何做到這一點?

此外,我懷疑單個查詢可能不是最有效的方法來做到這一點,即使它是可以實現的。 會是什麼「最佳實踐」的方式來做到這一點(與我真的需要測試,當然我自己的系統上的所有附帶條件)

回答

1

你也可以做子查詢計數使用另一個窗口功能:

SELECT userid, createdat, displaydate 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY userid ORDER BY createdat) as seqnum, 
      COUNT(*) OVER (PARTITION BY userid) as cnt 
     FROM data t 
    ) x 
WHERE x.seqnum <= 100 AND x.cnt > 100; 
0

試試這個

SELECT userid, createdat, displaydate 
FROM 
    (SELECT ROW_NUMBER() OVER 
     (PARTITION BY userid ORDER BY createdat) as r,count() OVER 
     (PARTITION BY userid) as counting 
      t.* FROM data t) x 
WHERE x.r <=100 and counting > 100