我需要以某种方式获得在这两个表中以任意组合具有[约会日期]的患者列表。 (例如,自2015年11月1日至今,可以在表A中出现两次,或表A和B,或表B两次)。
真的很难对付这个,所以任何帮助都会非常感激!
患者表A
PatientID,约会日期,测试,等等,等等
患者表B
PatientID,约会日期,等等等等。
我认为我最喜欢的是如果可能的话,从两个表中返回所有行?理想输出看起来像
PatientID, Appointment Date, Age, Gender, Location
86677, 23-11-2015, Age 74, Male, UK
86677, 03-12-2015, Age 74, Male, UK
此外,如果表A是门诊病人且表B是住院病人,我如何添加额外的列来帮助识别?例如,如果上面的例子在2015年11月23日有一个住院病人预约,而在2015年12月3日有一个门诊病人,我怎么能在我的输出中识别2?
答案 0 :(得分:0)
这可能最终会很慢,但基本逻辑是:
SELECT patient_id
FROM (
SELECT patient_id
FROM table_a
WHERE appointment_date >= '2015-11-01'
UNION ALL
SELECT patient_id
FROM table_b
WHERE appointment_date >= '2015-11-01'
) combined
GROUP BY patient_id
HAVING COUNT(*) >= 2
通过分解组合可以获得更好的表现:
SELECT patient_id
FROM table_a
WHERE appointment_date >= '2015-11-01'
GROUP BY patient_id
HAVING COUNT(*) >= 2
UNION
SELECT patient_id
FROM table_b
WHERE appointment_date >= '2015-11-01'
GROUP BY patient_id
HAVING COUNT(*) >= 2
UNION
SELECT a.publisher_id
FROM table_a a
JOIN table_b b
ON b.patient_id = a.patient_id
AND b.appointment_date >= '2015-11-01'
WHERE a.appointment_date >= '2015-11-01'
答案 1 :(得分:0)
此解决方案在设计时考虑了SQL服务器,尽管它可以与其他一些方言一起使用。基本思想是将两个表与新属性(住院病人/门诊病人)组合成一个虚拟表,您可以在以下查询中调用该表。这被称为公用表表达式(CTE)。
CTE创建一个组合表,然后您可以执行一些检查。我们在CTE中执行日期检查,但是在我们组合表之后,为了避免重复日期过滤器。当我们调用CTE时,我们会让它返回组合表中有2个或更多记录的患者的PatientID列表。我们使用该列表作为WHERE中的过滤器,从同一列表中选择那些患者的所有记录。
WITH combo AS
( SELECT
*
FROM
( SELECT
PatientID
, Appointment_Date
, Age
, Gender
, Location
, 'Inpatient' Record_Source
FROM
TableB
UNION ALL /* UNION drops duplicates; need UNION ALL */
SELECT
PatientID
, Appointment_Date
, Age
, Gender
, Location
, 'Outpatient' Record_Source
FROM
TableB
) sub
WHERE /* Filter date after union to be DRY programming */
Appointment_Date >= '2015-11-01'
)
SELECT
*
FROM
combo
WHERE
PatientID IN
( SELECT PatientID
FROM combo
GROUP BY PatientID
HAVING count(*) >= 2
)