【问题标题】:Postgresql - retrieve rows within criteria within 30 day spanPostgresql - 在 30 天内检索条件内的行
【发布时间】:2014-09-19 23:04:46
【问题描述】:

我有以下表格

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

这是一个 SQL Fiddle:http://sqlfiddle.com/#!15/e7403

注意事项:

  • AdmittedPatients 是医院所有患者入院/出院的历史记录。
  • Patients 包含在医院有记录的所有患者。患者还列出了目前住在医院的人(即出院为 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;

当它应该是 0、1、2 和 4 时,它会从 0、1 和 4 返回 pid。

【问题讨论】:

  • 既然入院日期在病历上,我们能做的就是看看最近的入院时间就够了吗?
  • 它为我返回的数据不是你已经编辑了最后一行。
  • @xQbert - 是的。我应该提到这是我编写的第一个数据库。显然,设计并不优雅。
  • @Scott - 再次编辑。
  • @piofusco 只是一个警告。每当您遇到数据库的结构问题时,请认真考虑一下。如果现在不能扩展,任何使用这种结构的开发都必须改变。这可能会导致以后的大量返工。获得正确的设计和可扩展性非常重要,否则您将不得不继续返工疏远开发人员和客户。

标签: sql postgresql


【解决方案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

【讨论】:

  • 我已将小提琴更新为 Postgres 9.3.1。一个快速的谷歌搜索让我相信 MySQL 中的 date_add() 与 PostgreSQL 不同。关于如何让它在 PostgreSQL 中工作的建议?
  • @Piofusco 添加了对 PostgreSQL 的响应
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    在出院前和出院后+30后录取

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

    我认为您正在寻找入院=出院

    【讨论】:

    • 我阅读了整个问题。我对数据库设计有疑问,当它存在于 AdmittedPatients 表中时,入院日期在 Patient 表中是如何存在的。这当然不是我编写查询的方式。但是如果 2 个条件相互矛盾,where 子句错误总是会导致 0 个结果
    • 已编辑查询 - 并不意味着最后一行。
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多