【问题标题】:Postgres: return first N rows per group for groups having a minimum countIPostgres:为具有最小计数的组返回每组的前 N ​​行
【发布时间】:2016-11-30 01:37:43
【问题描述】:

我复制了这篇有用的帖子 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

特别是我尝试了以下导致错误:

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 行。 我怎样才能做到这一点?

此外,我怀疑单个查询可能不是最有效的方法,即使它可以实现。 执行此操作的“最佳实践”方式是什么(当然还有我真正需要在自己的系统上测试的所有条件)

【问题讨论】:

    标签: sql postgresql aggregation


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      试试这个

      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
      

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 2019-05-27
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多