[英]FInding the the most frequent value for a particular year in postgres
在 postgre 中,我想找到 2011 年對以下數據庫的“打開”請求數量最多的用戶。 我是 postgre 的新手,我堅持這一點。
ID PERSON REQUEST DATE
4 datanoise opened 2008-09-02
5 marsuboss opened 2009-09-02
6 m3talsmith opened 2009-09-06
7 sferik opened 2010-09-08
8 sferik opened 2010-09-09
8 dtrasbo discussed 2010-09-09
8 brianmario discussed 2011-09-09
8 sferik discussed 2011-09-09
9 rsim opened 2011-09-09
.....more tuples to follow
這只是數據庫的一小部分,總共大約有 250,000 個元組。
您不能嵌套聚合,並且在任何情況下您都需要按計數排序的整個頂行:
select person, count(request) as countRequests
from table
where (date >= '2011-01-01' and date < '2012-01-01')
and request = 'opened'
group by person
order by countRequests desc
limit 1;
按日期過濾的最佳方法是使用半開間隔,即>= start and < dayAfterEnd
你能試試下面的
WITH CTE(ID,PERSON,REQUEST,DATE) AS
(
SELECT 4,'datanoise','opened','2008-09-02'
UNION ALL
SELECT 5, 'marsuboss', 'opened', '2009-09-02'
UNION ALL
SELECT 6 , 'm3talsmith', 'opened' , '2009-09-06'
UNION ALL
SELECT 7 , 'sferik' , 'opened', '2010-09-08'
UNION ALL
SELECT 8 , 'sferik', 'opened' , '2010-09-09'
UNION ALL
SELECT 8 , 'dtrasbo', 'discussed', '2010-09-09'
UNION ALL
SELECT 8 , 'brianmario', 'discussed' , '2011-09-09'
UNION ALL
SELECT 8 , 'sferik', 'discussed', '2011-09-09'
UNION ALL
SELECT 9 , 'rsim', 'opened', '2011-09-09'
)
SELECT C.PERSON,COUNT(C.ID)CNTT
FROM CTE AS C
WHERE C.DATE >= '2011-01-01'AND C.DATE<'2012-01-01'
AND C.REQUEST='OPENED'
GROUP BY C.PERSON
ORDER BY COUNT(C.ID)DESC
LIMIT 1;
您正在尋找不止一個人。 這建議使用 window 函數:
SELECT P.*
FROM (SELECT T.PERSON, COUNT(*) AS CNT,
RANK() OVER (OVER BY COUNT(*) DESC) AS SEQNUM
FROM T
WHERE T.DATE >= '2011-01-01'AND T.DATE < '2012-01-01' AND
T.REQUEST = 'OPENED'
GROUP BY T.PERSON
) P
WHERE seqnum = 1;
或者,如果您使用的是 Postgres 13+,則可以使用WITH TIES
:
SELECT T.PERSON, COUNT(*) AS CNT
FROM T
WHERE T.DATE >= '2011-01-01'AND T.DATE < '2012-01-01' AND
T.REQUEST = 'OPENED'
GROUP BY T.PERSON
ORDER BY COUNT(*) DESC
FETCH FIRST 1 ROW WITH TIES
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.