【问题标题】:SQL find overlapping appointmentsSQL 查找重叠约会
【发布时间】:2015-08-28 13:18:55
【问题描述】:

我正在尝试制作一份报告,以确定是否有任何客户 (patient_id) 在我们的系统中有重复的预约。我有 proc_chron(开始时间到秒)、proc_chron_end(结束时间到秒)和 proc_duration 的字段。预先感谢您的任何帮助。

select

patient_id,
attending_id,
proc_duration,
proc_chron,
proc_chron_end


from patient_clin_tran
where place_of_service not in ('23', '24', '25', '26')
and (proc_chron between '2015-06-01' and '2015-09-01')
and billing_proc_code not in ('BHHMTH')

【问题讨论】:

  • 您可能想澄清输出应该是什么。它应该只列出有重叠的客户,还是列出实际重叠的约会?
  • 为什么是 3 列(开始、结束和持续时间)? 2 就足够了 - 现在您面临数据不一致的风险!
  • 您可以移动持续时间。我只包括了 3 个我不确定哪种类型的逻辑最好的地方。我的最终目标是能够将查询插入到水晶报告中,并从那里按患者 ID 分组并在下面列出冲突。这样我就可以看到在冲突中需要与参加者讨论什么。

标签: sql sql-server-2008-r2


【解决方案1】:

方法是在where 子句中添加一个带有相关子查询的exists 谓词,将结果限制为那些重叠的约会。

select
    patient_id,
    attending_id,
    proc_duration,
    proc_chron,
    proc_chron_end
from patient_clin_tran p    -- notice the table alias
where place_of_service not in ('23', '24', '25', '26')
and (proc_chron between '2015-06-01' and '2015-09-01')
and billing_proc_code not in ('BHHMTH')

and case when exists (
    select 1 from patient_clin_tran 
    where patient_id = p.patient_id
      and attending_id <> p.attending_id
      and p.proc_chron < proc_chron_end 
     and p.proc_chron_end > proc_chron
) then 1 else 0 end = 1
order by p.patient_id, p.attending_id;

Sample SQL Fiddle 带有一些虚构的数据。

这仅检查具有不同attending_id 的重叠约会。如果您想检查与同一参加者的重叠,那么您必须删除 and attending_id &lt;&gt; p.attending_id 并添加一个唯一标识每一行的条件,以便约会不会与其自身重叠。

【讨论】:

  • 感谢您的回复。我的最终目标是将其放入水晶报告中,我们的计费部门可以查看我将按患者分组的位置,并在该组下显示重复的冲突以及两个主治人员(工作人员)是谁,以便我们澄清。消息 102,级别 15,状态 1,第 9 行 ',' 附近的语法不正确。消息 156,级别 15,状态 1,第 18 行关键字“then”附近的语法不正确。
  • @JeremyMcDevitt 检查(proc_chron between '2015-06-01' and '2015-09-01') 行我不小心在末尾添加了,'02'(也在billing_proc_code not in ('BHHMTH') 行)删除它应该没问题。小提琴中的查询应该没问题,我现在也修复了答案。
  • @JeremyMcDevitt 将子查询中的最后一个条件更改为and p.proc_chron &lt;= dateadd(second,-1,proc_chron_end) and dateadd(second,-1,p.proc_chron_end) &gt;= proc_chron 或将&lt;=&gt;= 更改为&lt;&gt;。两者都应该工作。
  • 我在结尾添加了一个以; 结尾的语句。只需在此之前添加order by。我已更新答案以包含订单
  • 非常感谢。现在很完美。我非常感谢您的所有帮助。
【解决方案2】:

这会告诉你你在哪里有重叠的约会:

;WITH cte AS (
SELECT 
  patient_id
  ,attending_id
  ,proc_duration
  ,proc_chron
  ,proc_chron_end
FROM patient_clin_tran
WHERE place_of_service NOT IN ('23', '24', '25', '26')
  AND proc_chron BETWEEN '2015-06-01' AND '2015-09-01'
  AND billing_proc_code NOT IN ('BHHMTH'))
SELECT c1.*
FROM cte c1
  INNER JOIN cte c2 ON c1.patient_id = c2.patient_id
WHERE c2.proc_chron BETWEEN c1.proc_chron AND c1.proc_chron_end
  AND c2.proc_chron_end BETWEEN c1.proc_chron AND c1.proc_chron_end
  AND c1.attending_id != c2.attending_id

我所做的只是将您的查询包装在一个公用表表达式中,然后在患者 ID 上将其与自身连接起来。然后 where 子句只过滤不包括相同约会的重叠约会。

【讨论】:

  • Msg 4145,级别 15,状态 1,第 14 行 在预期条件的上下文中指定的非布尔类型表达式,靠近“与”。我得到这个是因为一个错误。不确定 AND 的语法有什么问题。
  • 抱歉,我的连接条件是 AND 而不是 =,现在已更正。
  • 此代码似乎不起作用,并且会显示日期范围内的所有内容,但提供的其他代码可以。感谢您花时间输入。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多