我复制了这个有用的帖子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行。 如何实现这一目标?
此外,我怀疑单个查询可能不是最有效的方法,即使它是可以实现的。 这样做的“最佳实践”方法(当然我需要在自己的系统上测试所有附带条件)
答案 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