2017-08-30 1 views
0

Ich habe eine Tabelle in meiner SQL Server-Datenbank, die eine UserID, den Namen eines medizinischen Zustands und ein Diagnosedatum für diesen medizinischen Zustand speichert.Wie kann ich herausfinden, wie viele Benutzer zwei medizinische Bedingungen in meiner SQL Server-Datenbank haben?

UserID   ConditionName  DiagnosisDate 
9038   Hypertension   1971-07-14 
9039   Diabetes    1964-05-13 

kann jeder Benutzer mehrere medizinische Bedingungen (das heißt ein Benutzer mit der Benutzer-ID 9038 kann zu Kopfschmerzen, Diabetes und Bluthochdruck).

Ich möchte eine Abfrage schreiben, die Komorbidität von Benutzern findet.

Zum Beispiel möchte ich wissen, wie viele Menschen mit Hypertonie auch Diabetes haben.

Antwort

1

Dafür gibt es viele Lösungen. Mit IN

SELECT count(*) 
FROM tab 
WHERE userid IN (SELECT t2.userid FROM tab t2 WHERE t2.ConditionName = 'Hypertension') and 
     userid IN (SELECT t2.userid FROM tab t2 WHERE t2.ConditionName = 'Diabetes') 

EXISTS

SELECT count(*) 
FROM tab t1 
WHERE EXISTS(SELECT 1 FROM tab t2 WHERE t2.ConditionName = 'Hypertension' AND t2.userid = t1.userid) and 
     EXISTS(SELECT 1 FROM tab t2 WHERE t2.ConditionName = 'Diabetes' AND t2.userid = t1.userid) 

mit mit INTERSECT

SELECT count(*) 
FROM 
(
    SELECT userid FROM tab WHERE ConditionName = 'Hypertension' 
    INTERSECT 
    SELECT userid FROM tab WHERE ConditionName = 'Diabetes' 
) x 

mit GROUP BY

SELECT userid 
FROM tab 
WHERE ConditionName = 'Diabetes' or ConditionName = 'Hypertension' 
GROUP BY userid 
HAVING count(distinct ConditionName) = 2; 

dbfiddle demo

0
select count(1) 
from yourTable t 
where t.ConditionName = 'hypertension' 
    and exists (
     select 1 
     from yourTable ref 
     where ref.UserId = t.UserId 
      and ref.ConditionName = 'diabetes' 
    ) 
+0

Eine Sache, mit beachten [ korrelierte Unterabfragen] (https://en.wikipedia.org/wiki/Correlated_subquery) können sie ineffizient sein. –

+0

unter der Annahme, dass wir nichts über Indizes wissen, kann mein Abfrageplan gleich oder sogar besser sein als Thomas ', der bisher von Zuschauern bevorzugt wird. – avb

2

Sie können dies eine subelect mit tun:

SELECT COUNT(*) FROM YourTable 
    WHERE ConditionName = 'Hypertension' 
     AND UserID IN 
      (
       SELECT UserID FROM YourTable 
        WHERE ConditionName = 'Diabetes' 
      ); 

Dies wird Ihnen eine Zählung aller Datensätze mit Hypertonie geben. Wenn eine Benutzer-ID dieselbe Bedingung mehrfach haben kann, müssen Sie COUNT(*) durch COUNT(DISTINCT UserID) ersetzen.

3

Dies zeigt alle Benutzer mit multible medizinischen Bedingungen:

SELECT UserID, COUNT(DISTINCT ConditionName) AS medical_conditions 
FROM <TABLE> 
GROUP BY UserID 
HAVING medical_conditions >= 2; 

Wenn Sie für bestimmte medizinische Bedingungen suchen, die Sie IN und Unterabfragen verwenden:

SELECT UserID 
FROM <TABLE> 
WHERE ConditionName = 'Diabetes' 
AND UserID IN (SELECT UserID FROM <TABLE> WHERE ConditionName = 'Hypertension'); 
+1

Eigentlich finde ich deine erste Lösung komisch. Was passiert, wenn der Benutzer an verschiedenen Daten dieselbe Diagnose hat? –

+0

@Radim Bača Sie haben Recht. Ich habe die Erklärung aktualisiert. Danke für den Tipp. –

Verwandte Themen