2016-07-26 54 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