计数有条件的PostgreSQL



我有一张桌子,里面有人和其他人。只有当这是第一次访问时,我才需要计算当月的访问次数。因此,基本上要统计当月的访问次数,但前提是你当月的访问是第一次。

示例:

PEOPLE:
id   
---------
20   
30   
23   
VISITS
id     |   date
-------------------------
20     |   09-20-2019
20     |   10-01-2019
23     |   10-09-2019
30     |   10-07-2019

我只想知道如果是第一次计数,在这个例子中,计数应该等于2,因为ID为20的人上个月有过一次访问。

这是我到目前为止在我的查询上看到的

SELECT * FROM visits
LEFT JOIN people ON visits.id = people.id
WHERE date_trunc('month', current_date) <= visits.visit_date AND visits.visit_date < date_trunc('month', current_date) + INTERVAL '1 month'

这只是给我一个月的访问量。如果对方没有过去的访问,我怎么能筛选。

您可以通过比较月份来简化条件。添加not exists以检查此人在本月之前是否有就诊。

select * 
from visits
left join people on visits.id = people.id
where date_trunc('month', current_date) = date_trunc('month', visits.visit_date)
and not exists (
select from visits
where id = people.id
and date_trunc('month', current_date) > date_trunc('month', visits.visit_date)
)

根据我对您需求的理解,您只需要获得上次访问的人员ID。

我的建议是在date_trunc('month', visit_date)的基础上使用dense_rank()

select v.id from visits v
inner join 
(select dense_rank() over (partition by date_trunc('month', visit_date) order by visit_date) as rn
, *
from visits) t1 on t1.id = v.id
group by v.id, t1.rn
having count(v.id) > 1

最新更新