1

病院に複数回通院した人の数を調べるように設計されたクエリがあります。私が持っているものは機能しますが、サブクエリなしでそれを行う方法はありますか?

SELECT count(*) as counts, hospitals.hospitalname 
    FROM  Patient INNER JOIN
    hospitals ON Patient.hospitalnpi = hospitals.npi
    WHERE     (hospitals.hospitalname = 'X')
    group by patientid, hospitalname
    having count(patient.patientid) >1
    order by count(*) desc

これにより、常に正しい行の数(30)が返されますが、30の数は返されません。を削除するとgroup by patientid、結果セット全体が返されます。

私はこの問題を解決しました

select COUNT(*),hospitalname 
from
(
    SELECT count(*) as counts,hospitals.hospitalname 
        FROM hospitals INNER JOIN
        Patient ON hospitals.npi = Patient.hospitalnpi
        group by patientid, hospitals.hospitalname
        having count(patient.patientid) >1

) t 
group by  t.hospitalname
order by t.hospitalname desc

常にサブクエリを使用するよりも、より洗練されたソリューションが必要だと感じています。これをどのように改善できますか?

sample data from first query
row #  revisits  
    1  2
    2  2
    3  2
    4  2

same data from second, working query
row#    hosp. name    revisitAggregate
1       x             30 
2       y             15 
3       z             5

患者と病院の間の単純な1対多の関係

4

2 に答える 2

2

それは超ハッキーですが、ここにあります:

SELECT TOP 1 
    ROW_NUMBER() OVER (order by patient.patientid) as Count
FROM  
    Patient 
    INNER JOIN hospitals 
        ON Patient.hospitalnpi = hospitals.npi
WHERE     
    (hospitals.hospitalname = 'X')
GROUP BY 
    patientid, 
    hospitalname
HAVING
    count(patient.patientid) >1
ORDER BY 
    Count desc
于 2012-08-01T17:48:45.837 に答える
0
    select distinct hospitalname, count(*) over (partition by hospitalname) from (
    SELECT hospitalname, count(*) over (partition by   patientid,
    hospitals.hospitalname)   as counter
    FROM hospitals INNER JOIN
    Patient ON hospitals.npi = Patient.hospitalnpi
    WHERE     (hospitals.hospitalname = 'X')
    ) Z
    where counter > 1
于 2012-08-01T18:03:31.050 に答える