Postgres:对于具有最小countI的组,每组返回N行

时间:2016-07-26 11:59:27

标签: sql postgresql aggregation

我复制了这个有用的帖子Grouped LIMIT in PostgreSQL: show the first N rows for each group?的逻辑,按组创建前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
HAVING COUNT(*) > 100

特别是我尝试了以下操作,这导致了一个错误:

{{1}}

理想情况下,对于拥有至少100行数据的用户,我会为每个用户获得前100行。 如何实现这一目标?

此外,我怀疑单个查询可能不是最有效的方法,即使它是可以实现的。 这样做的“最佳实践”方法(当然我需要在自己的系统上测试所有附带条件)

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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