3

我不确定这个问题是否准确,但我想不出一种表达方式。我将尝试用一个例子来解释它。

考虑一个包含访问 ID (VID)、患者 ID (PID) 和医院 ID (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”

4

3 回答 3

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% 及以上,请将其更改>>=.

于 2013-09-30T21:35:53.427 回答
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

编辑:添加错过的演员表浮动

于 2013-09-30T21:40:27.097 回答
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
于 2013-09-30T21:51:06.740 回答