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