我不确定这个问题是否准确,但我想不出办法。我将尝试使用一个例子来解释它。
考虑具有visitID(VID),patientID(PID)和hospitalID(HID)属性的各个医院就诊表。
VID PID HID
1 A x
2 A y
3 A x
4 B z
5 B z
我要做的是识别PID-HID对,其中该PID的总VID的50%以上是指定的HID。在这种情况下,我希望它返回“A& x”,因为PID“A”的总VID的2/3处于HID“x”和“B& Z”,因为“B”的所有VID都是在“z”
答案 0 :(得分:2)
这可能很讨厌,但我认为它可以做到这一点。
它假设您的表名为visits
;with infoCte as (
select pid, hid, count(*) as visitcount
from visits
group by pid, hid
)
select *
from infocte i
where visitcount > (
select count(*) / 2 as midcount
from visits v
where v.pid = i.pid
)
第一部分获得患者和医院的所有访问次数。第二部分将结果限制为仅有50%以上时间访问过该特定医院的人。如果您需要50%及以上,请将>
更改为>=
。
答案 1 :(得分:0)
试试这个:
select PID,HID,100*cast(PHtotal as float)/Ptotal as PHperc
from
(select PID,count(*) as Ptotal from tbl group by PID) t,
(select PID,HID,count(*) as PHTotal from tbl group by PID,HID) s
where s.PID=t.PID and cast(PHtotal as float)/Ptotal>0.5
编辑:添加错过的演员阵容
答案 2 :(得分:0)
适用于SQL 2012。
这是SqlFiddle上的演示。
with cte
as
(
select *, COUNT(PID) OVER(PARTITION BY PID, HID ORDER BY HID)*100.00/COUNT(PID) OVER(PARTITION BY PID ORDER BY PID) cnt
from visits
)
select *
from cte
where cnt > 50