【发布时间】:2016-06-11 00:25:12
【问题描述】:
对于 SQL,我几乎是个菜鸟,因此我们将不胜感激。我有一个大型数据集,我正在为医院过滤。我从 6 个不同的表中提取数据,我的一个表每次访问都有重复的行。我只想为每次访问拉一行(拉到哪一行都没有关系)。我知道我需要使用 DISTINCT 或 GROUP BY 子句,但我的语法一定是错误的。
SELECT
ADV.[VisitID] AS VisitID
,ADV.[Name] AS Name
,ADV.[UnitNumber] AS UnitNumber
,CONVERT(DATE,ADV.[BirthDateTime]) AS BirthDate
,ADV.[ReasonForVisit] AS ReasonForVisit
,ADV.[AccountNumber] AS AccountNumber
,DATEDIFF(day, ADV.ServiceDateTime, DIS.DischargeDateTime) AS LOS
,ADV.[HomePhone] AS PhoneNumber
,ADV.[ServiceDateTime] AS ServiceDateTime
,ADV.[Status] AS 'Status'
,PRV.[PrimaryCareID] AS PCP
,LAB.[TestMnemonic] AS Test
,LAB.[ResultRW] AS Result
,LAB.[AbnormalFlag] AS AbnormalFlag
,LAB.[ResultDateTime] AS ResultDateTime
,DIS.[Diagnosis] AS DischargeDiagnosis
,DIS.[ErDiagnosis] AS ERDiagnosis
,DCP.[TextLine] AS ProblemList
FROM Visits ADV
LEFT JOIN Tests LAB ON ( LAB.VisitID = ADV.VisitID AND
LAB.SourceID = ADV.SourceID )
LEFT JOIN Discharge DIS ON ( DIS.VisitID = LAB.VisitID AND
DIS.SourceID = LAB.SourceID )
LEFT JOIN Providers PRV ON ( PRV.VisitID = DIS.VisitID AND
PRV.SourceID = DIS.SourceID )
LEFT JOIN ProblemListVisits EPS ON ( EPS.VisitID = PRV.VisitID AND
EPS.SourceID = PRV.SourceID )
LEFT JOIN ProblemList DCP ON ( DCP.PatientID = EPS.PatientID AND
DCP.SourceID = EPS.SourceID )
WHERE ( DCP.[TextLine] LIKE '%Diabetes%' OR
DCP.[TextLine] LIKE '%Diabetic%' OR
DCP.[TextLine] LIKE '%DM2%' OR
DCP.[TextLine] LIKE '%DKA%' OR
DCP.[TextLine] LIKE '%Hyperglycemia%' OR
DCP.[TextLine] LIKE '%Hypoglycemia%' ) AND
( LAB.[TestMnemonic] = 'GLU' OR
LAB.[TestMnemonic] = '%HA1C' ) AND
ADV.[Status] != 'DIS CLI' )
所以这可以正常工作,但是当医生进入患者的问题列表并进行更改时,它会重新归档整个列表,从而再次填充问题列表表。因此,对于 1 次访问,由于 ProblemList,我可能会获得 4 个重复条目,而我只想要一个。哪一个也无所谓。
我尝试引用其他问题并在其中嵌套另一个 SELECT 语句,但我不断收到语法错误。
这是重复值的样子:
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled
最后,“2 型糖尿病,受控”是导致重复的原因。如果我从查询中删除 ProblemListVisit 和 ProblemList 表,我只会得到一行数据。
最重要的是获得所有独特的测试结果,但不是问题列表的所有重复条目(只想知道他们患有哪种类型的糖尿病,ONCE)。
谢谢!
【问题讨论】:
-
要获得不同,您只需将单词
distinct放在单词select旁边,然后按原样运行查询。最好找出为什么有重复项。据推测,problemlistvisit 和problemlist 表中的某些值未显示在选择列表中,但它们并没有区别。通过select *并找出导致“重复”的值来更好地追踪它们 -
在将 DISTINCT 投入其中之前,我会尝试找出真正问题的根源。选择所有列
SELECT *...并在其他重复的行中查找不同的列,这将是一个很好的故障排除步骤。 -
正如@dan08 所说,但我最感兴趣的是
ProblemList表中重复的性质,而不是查询结果,因为前者驱动后者。 -
您的连接看起来很可疑。几乎所有内容都通过相同的
VisitID和SourceID连接,但看起来所有表都以对应于连接的方式相关联。此外,ProblemList 表 not 是否像所有其他表一样具有VisitID列?如果有,那么您在加入该表时可能需要考虑到这一点。 -
谢谢大家!我知道为什么会有重复。不幸的是,每次医生提交问题列表时,它都会创建一个新条目,该条目附加到相同的
PatientID,从而创建了重复项。 @John:ProblemList 表没有VisitID,这是正确的。这就是为什么我必须先加入 ProblemListVisit 表,该表同时包含VisitID和PatientID@paqogomez:没有意识到Distinct这么简单!谢谢,效果很好。
标签: sql duplicates left-join