Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在日期范围内统计前N名记录_Postgresql - Fatal编程技术网

Postgresql 在日期范围内统计前N名记录

Postgresql 在日期范围内统计前N名记录,postgresql,Postgresql,我有一张如下所示的表: +---------+---------+----------+ |id |title |date | +---------+---------+----------+ |1 |A |2017-05-01| |2 |C |2017-05-01| |3 |A |2017-05-02| |4 |A |2017-05-01| |5

我有一张如下所示的表:

+---------+---------+----------+
|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|
+---------+---------+----------+
+---------+---------+----------+
|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|
+---------+---------+----------+
我希望查询此表并返回日期前2名的计数。因此,我希望它返回以下内容:

+---------+---------+----------+
|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|
+---------+---------+----------+
+---------+---------+----------+
|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|
+---------+---------+----------+

结果可能与我在示例表中输入的结果不匹配,但我认为重点可能在那里

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

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

您可以在单个步骤中组合窗口函数和聚合函数:

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;

您可以将窗口函数和常规聚合组合到一个查询中。@a_horse_和_no_name是的,但这样读起来会不会更难?Gordon的查询不起作用,顺便说一下,我测试了它。Gordon在内部查询中忘记了group by。您在内部查询中忘记了group by t.date,t.title