Postgresql - 在30天内检索标准内的行

时间:2014-07-28 17:21:24

标签: sql postgresql

我有以下表格

AdmittedPatients(pid, workerid, admitted, discharged)
Patients(pid, firstname, lastname, admitted, discharged)
DiagnosticHistory(diagnosisID, workerid, pid, timeofdiagnosis)
Diagnosis(diagnosisID, description)

这是一个SQL小提琴:http://sqlfiddle.com/#!15/e7403

注意事项:

  • AdmittedPatients是医院所有患者入院/出院的病史。
  • 患者包含在医院有记录的所有患者。患者还列出了目前住在医院的人(即出院时为NULL)。
  • DiagnosticHistory包含所有诊断。
  • 诊断具有诊断描述

这是我的任务:列出在最后一次出院后30天内入院的患者。为每位患者列出他们的患者识别号,姓名,诊断和入院医生。

这是我到目前为止所做的事情:

select pid, firstname, lastname, admittedpatients.workerid, patients.admitted, admittedpatients.discharged
from patients 
join admittedpatients using (pid)
group by pid, firstname, lastname, patients.admitted, admittedpatients.workerid, admittedpatients.discharged
having patients.admitted <= admittedpatients.discharged;

当pid为0,1,2和4时,它会从0,1和4返回pid。

3 个答案:

答案 0 :(得分:1)

不确定为什么需要分组或在这里......没有聚合......

SELECT A.pid, firstname, lastname, A.workerid, P.admitted, A.discharged
FROM  patients P
INNER JOIN  admittedpatients A 
  on P.pID = A.pID
WHERE date_add(a.discharged, interval 30 day)>=p.admitted
and p.admitted >=a.discharged

更新小提琴:http://sqlfiddle.com/#!2/dc33c/30/0

没有返回所有需要的字段,但是当它获得所需的结果集时,我想它只是来自这里的一系列连接......

更新为postgresql:

SELECT A.pid, firstname, lastname, A.workerid, P.admitted, A.discharged
FROM  patients P
INNER JOIN  admittedpatients A 
  on P.pID = A.pID
WHERE a.discharged+ interval '30 day' >=p.admitted
and p.admitted >=a.discharged

http://sqlfiddle.com/#!15/e7403/1/0

答案 1 :(得分:1)

我没有在小提琴中看到任何诊断信息,所以我没有返回任何。

select pid
,p.lastname,p.firstname 
,ad.lastname,ad.firstname 
from AdmittedPatients as a
join AdmittedPatients as d using (pid)
join Patients as p using (pid)
join AdminDoctors as ad on ad.workerid=a.workerid
where d.discharged between a.admitted-30 and a.admitted

答案 2 :(得分:0)

这里有一个相当基本的WHERE子句错误:

在出院前和出院后不能两者 + 30

在整个查询结束之前,你还有一个额外的分号,可能会完全丢掉最后一行。

我认为你正在寻找被录取者=已经出院