我正在尝试用SQL做一些事情,但我无法弄清楚应该怎么做。我有这张桌子
----------------------------------
|id_visit | visit_date | ssn |
----------------------------------
|1 |1940-01-07 |123125789|
----------------------------------
|2 |1975-03-15 |987743271|
----------------------------------
| ... | ... | ... |
我需要选择一年内访问过五次以上的患者的SSN。我怎么做?我知道它涉及'HAVING COUNT(id_visit)'但是时间部分......这是一个不同的故事,因为我的目标不是在特定的时间范围内选择ssn,而是在一般范围内。
从@Gordon Linoff回答,我稍微修改了一下查询,以消除结果中的重复并获得最大结果。
select p_ssn as SSN, max(visits_within_one_year) as "Maximum number of visits"
from (select t.p_ssn,count(*) as visits_within_one_year
from t join
t tyr
on t.p_ssn = tyr.p_ssn and
tyr.visit_date between t.visit_date and adddate(t.visit_date, 365)
group by t.p_ssn,t.visit_date
having visits_within_one_year > 5)results
group by p_ssn;
答案 0 :(得分:2)
假设您的意思是日历年,以下查询将检索SSN在一年中出现五次以上的所有SSN和年份组合:
select ssn, year(visit_date) as yr
from t
group by ssn, year(visit_date)
having count(*) > 5;
如果问题是关于任意年份的,那么您可以使用自联接和聚合:
select t.ssn, t.visit_date, count(*) as visits_within_one_year
from t join
t tyr
on t.ssn = tyr.ssn and
tyr.visit_date between t.visit_date and adddate(t.visit_date, 365)
group by t.ssn, t.visit_date
having visits_within_one_year > 5;
答案 1 :(得分:1)
如果你的意思是在太阳年(jan / dec)内获得那些ssn:
select ssn
from tablename
group by ssn,year(visit_date)
having count(ssn)>5