簡體   English   中英

在 postgres 中查找特定年份的最常見值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM