我复制了这个有用的postGrouped 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

我特别尝试了以下操作,结果导致错误:
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行。我怎样才能做到这一点?
另外,我怀疑一个查询可能不是最有效的方法,即使它是可以实现的。做这件事的“最佳实践”方法是什么(当然,我需要在自己的系统上测试所有的附加条件)

最佳答案

也可以使用另一个窗口函数在子查询中进行计数:

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;

关于sql - Postgres:对于数量最少的组,每组返回前N行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38589305/

10-13 00:52