我有一个在特定日期登录网站的ID列表。 我需要找到每个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
我确信它不对,因为它将count返回到所有id。 你有什么想法? 对不起,我是这些人的新手。
答案 0 :(得分: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
请注意,我从date
列表中删除了SELECT
字段,因为将其包含在那里没有任何意义,因为它不是聚合(即Postgres不知道哪个< / em>您希望为每个id
组显示的日期。