2015-10-16 100 views
2

我有一個在特定日期登錄到站點的ID列表。 我需要找到每個ID從登錄的最初日期到一年後登錄的次數。 到現在爲止我的查詢是:查找postgres中特定時間範圍內的ID數量

select count(id), id, date 
from table 
where date >= (SELECT min(date) AS mindate from table) 
and date < (SELECT min(date) + interval '1 year' from table) 
group by 2, 3 

我相信這是不對的,因爲它返回計數爲1到所有的ID。 你有什麼想法嗎? 對不起,我是所有這些的新手。

回答

1

我的策略是先計算爲每個id組最小日期,然後再加入使用您在原始WHERE條款有標準這個回原始表。這有效地刪除了不在所需範圍內的各個id組的記錄。在此之後,只需要一個簡單的GROUP BY即可獲得您的結果。

SELECT id, COUNT(id) 
FROM table t1 INNER JOIN 
(
    SELECT id, MIN(date) AS mindate 
    FROM table 
    GROUP BY id 
) t2 
ON t1.id = t2.id AND t1.date >= t2.mindate 
    AND t1.date < t2.mindate + INTERVAL '1 year' 
GROUP BY id 

注意,我從SELECT列表中刪除date領域,因爲它沒有任何意義的,它存在,因爲它不是一個聚合(即Postgres的不知道日期要顯示每組id組)。

+0

不,實際上是一樣的。我認爲問題在於,它只用我記錄中的最小日期,而不是每個id的最小日期。 – johnben

+0

儘管如果我刪除日期,它確實計算了ids的數量,但它仍然只返回來自第一年的值,而不是從第一次登錄到一年後的值。當我用min(date)和id查詢時,只有我有正確的結果,但是在子句中它有不同的輸出。 – johnben

+0

@johnben我更新了我的答案。你最初沒有把你的問題說得很清楚,我建議你這樣做,這樣下一次你能得到更好的答案。 –