【问题标题】:Count Top N Records Over Date Range Postgres计算日期范围内的前 N ​​条记录 Postgres
【发布时间】:2017-05-09 20:06:55
【问题描述】:

我有一个如下所示的表格:

+---------+---------+----------+
|id       |title    |date      |
+---------+---------+----------+
|1        |A        |2017-05-01|
|2        |C        |2017-05-01|
|3        |A        |2017-05-02|
|4        |A        |2017-05-01|
|5        |A        |2017-05-03|
|6        |B        |2017-05-01|
|7        |A        |2017-05-01|
|8        |D        |2017-05-03|
|9        |A        |2017-05-02|
|10       |B        |2017-05-01|
|11       |A        |2017-05-01|
|12       |C        |2017-05-02|
|13       |A        |2017-05-01|
|14       |B        |2017-05-01|
|15       |B        |2017-05-04|
|16       |A        |2017-05-03|
|17       |B        |2017-05-01|
|18       |A        |2017-05-01|
+---------+---------+----------+

我想查询这个表并按日期返回一个计数(前 2 个)。所以,我希望它返回以下内容:

+---------+---------+----------+
|count    |title    |date      |
+---------+---------+----------+
|6        |A        |2017-05-01|
|4        |A        |2017-05-02|
|1        |A        |2017-05-03|
|4        |B        |2017-05-01|
|5        |B        |2017-05-02|
|6        |B        |2017-05-03|
+---------+---------+----------+

(结果可能与我在示例表中的结果不匹配),但我认为重点可能就在那里。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    我认为您的问题需要两个聚合,第一个找到每个标题/日期组合的计数,第二个保留每个日期的两个最大计数。

    WITH cte1 AS (
        SELECT title, date, COUNT(*) AS t_count
        FROM yourTable
        GROUP BY title, date
    ),
    cte2 AS (
        SELECT title, date, t_count,
               ROW_NUMBER() OVER (PARTITION BY date ORDER BY t_count DESC) rn
        FROM cte1
    )
    SELECT title, date, t_count
    FROM cte2
    WHERE rn <= 2
    

    【讨论】:

    • 您可以将常规聚合的窗口函数组合成单个查询。
    • @a_horse_with_no_name 是的,但是这样不是更难阅读吗?戈登的查询不行,顺便测试了一下。
    • Gordon 在内部查询中忘记了 group by。
    【解决方案2】:

    您可以一步组合窗口函数和聚合函数:

    select cnt, title, date
    from (select t.date, t.title, count(*) as cnt,
                 row_number() over (partition by date order by count(*) desc) as seqnum
          from t
          group by t.date, t.title
         ) t
    where seqnum <= 2;
    

    【讨论】:

    • 您在内部查询中忘记了group by t.date, t.title
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多