我有一个非常复杂的查询。 其中一部分用 where 语句分隔,并排除放电日期大于 90 天前的结果
原始表中的日期格式为 2017-09-22
选择值如下所示
to_char("public".visit.visit_admit_date, 'MMDDYYYY') AS "Visit or Admit Date",
to_char("public".visit.visit_disch_date, 'MMDDYYYY') AS "Discharge Date",
WHERE
exists ( SELECT distinct on ("public".visit.visit_id) "public".procedure_group_cpt_code.pgrpcpt_code::text
FROM "public".visit
FULL OUTER JOIN "public".patient_procedure
ON "public".visit.visit_id = "public".patient_procedure.pproc_visit_num
FULL OUTER JOIN "public".procedure_desc_master_codes
ON "public".patient_procedure.pproc_cpcode = "public".procedure_desc_master_codes.pdescm_id
FULL OUTER JOIN "public".procedure_group_cpt_code
ON "public".procedure_group_cpt_code.pgrpcpt_pdescm_id = "public".procedure_desc_master_codes.pdescm_id
GROUP BY "public".visit.visit_id, "public".procedure_group_cpt_code.pgrpcpt_code
ORDER BY "public".visit.visit_id )
AND "public".visit.visit_stay_type = '1' OR "public".visit.visit_stay_type ='2'
最后一行是我认为按日期划分的正确方法。
AND "public".visit.visit_disch_date > (now() - interval '90 day' )
我的日期远远超出了几年前的范围
如果有人需要查看整个查询的更多内容,我会发布它。 它很大也很乐意包含任何人可能要求的更多信息。
问题是or
. 请改用in
:
"public".visit.visit_stay_type IN ('1', '2') AND
"public".visit.visit_disch_date > (now() - interval '90 day' )
其他一些建议:
- 学习使用表别名。
-
exists
子查询中不需要select distinct on
。 -
order by
几乎从不适合在子查询中使用。 - 很少需要
full outer join
。
同意IN
比这里的OR
更好,但是如果您想在将来的查询中使用OR
(例如,IN
不适合,因为您的OR
将在不同的列上运行(,您应该使用括号对条件进行分组,如下所示:
AND (
"public".visit.visit_stay_type = '1'
OR "public".visit.visit_stay_type ='2')
AND "public".visit.visit_disch_date > (now() - interval '90 day' )