Sql 检测超出日期间隔的重复项
我搜索了一下,但找不到直接的答案 有患者、医院、医学分支(急诊、泌尿外科、骨科、内科等)、医疗操作代码(检查、外科手术、MRI、超声波等)和患者就诊日期 病人去看医生,医生开了药,并要求再次来做控制检查。 如果患者在10天后返回,他必须向同一家医院支付另一笔检查费。医院可以在10天后指定一个日期,告知在接下来的10天内没有可用的时间,以获得检查费 表结构如下所示:Sql 检测超出日期间隔的重复项,sql,database,oracle,lag,oracle11gr2,Sql,Database,Oracle,Lag,Oracle11gr2,我搜索了一下,但找不到直接的答案 有患者、医院、医学分支(急诊、泌尿外科、骨科、内科等)、医疗操作代码(检查、外科手术、MRI、超声波等)和患者就诊日期 病人去看医生,医生开了药,并要求再次来做控制检查。 如果患者在10天后返回,他必须向同一家医院支付另一笔检查费。医院可以在10天后指定一个日期,告知在接下来的10天内没有可用的时间,以获得检查费 表结构如下所示: Patient id.no Hospital Medical Branch Medical Op. Code
Patient id.no Hospital Medical Branch Medical Op. Code Date
1 H1 M0 P1 01/05/2011
5 H1 M1 P9 03/05/2011
3 H2 M0 P2 09/05/2011
1 H1 M0 P1 14/05/2011
3 H1 M0 P2 20/05/2011
5 H1 M2 P9 25/05/2011
1 H1 M0 P3 26/05/2011
在这里,3号和5号患者的就诊并不构成问题,因为3号患者就诊于不同的医院,5号患者就诊于不同的医疗分支机构。即使他们在10天内参观,他们也会支付考试费
然而,1号患者在2005年1月1日和2005年14月14日就诊于同一家医院、同一分支机构,并接受相同的流程(P1:检查)
26/05不算,因为这不是体检
我想标记的是相同的患者、相同的医院、相同的分支机构和相同的医疗操作代码(即具体的医疗检查:P1),日期范围超过10天
结果表的格式:
HOSPITAL TOTAL NUM. of PATIENTS NUM. of PATIENTS OUT OF DATE RANGE
H1 x a
H2 y b
H3 z c
谢谢。再一次,这是救援的分析功能 此查询使用LAG()函数将表格中的记录与表格中以前的(由日期定义的)匹配记录(由患者ID定义的)链接起来
select hospital_id
, count(*) as total_num_of_patients
, sum (out_of_range) as num_of_patients_out_of_range
from (
select patient_id
, hospital_id
, case
when hospital_id_1 = hospital_id_0
and visit_1 > visit_0 + 10
and med_op_code_1 = med_op_code_0
then 1
else 0
end as out_of_range
from (
select patient_id
, hospital_id as hospital_id_1
, date as visit_1
, med_op_code as med_op_code_1
, lag (date) over (partition by patient_id order by date) as visit_0
, lag (hopital_id) over (partition by patient_id order by date) as hopital_id_0
, lag (med_op_code) over (partition by patient_id order by date) as med_op_code_0
from your_table
where med_op_code = 'P1'
)
)
group by hospital_id
/
警告:我还没有测试这段代码,所以它可能包含语法错误。下次访问Oracle数据库时,我会检查它。这有点粗糙,因为我手头没有Oracle数据库,但关键功能是相同的:分析函数LAG()。除了它的配套函数LEAD()外,它们还可以帮助处理活动周期等问题 以下是我对代码的尝试:
select n.hospital, COUNT(n.patient_id) as patients_out_of_date_range
from (
select *
from (
select d.*, lag(date, 1) over (partition by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code order by d.date) as prev_date
from datatable d inner join
(
select d.patient_id, d.hospital, d.medical_branch, d.medical_op_code
from datatable d
where d.medical_op_code = 'P1'
group by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code
having COUNT(d.date) > 1
) t on d.patient_id = t.patient_id and d.hospital = t.hospital and d.medical_branch = t.medical_branch and d.medical_op_code = t.medical_op_code
) m
where date - prev_date > 10
) n
group by n.hospital
就像我说的,这还没有经过测试,但至少应该让你朝着正确的方向开始
一些参考资料:
我想这就是你想要的:
WITH Patient_Visits (Patient_Id, Hospital_Id, Branch_Id, Visit_Date, Visit_Order) as (
SELECT Patient_Id, Hospital_Id, BranchId, Visit_Date,
ROW_NUMBER() OVER(PARTITION BY Patient_ID, Hospital_Id, Branch_Id,
ORDER_BY Patient_Id, Hospital_Id, Branch_Id, Visit_Date)
FROM Hospital_Visits
WHERE Procedure_Id = 'P1'),
Hospital_Recent_Visits (Hospital_Id, Recent_Visitor_Count) as (
SELECT a.Hospital_Id, COUNT(DISTINCT a.Patient_Id)
FROM Patient_Visits as a
JOIN Patient_Visits as b
ON b.Hospital_Id = a.Hospital_Id
AND b.Branch_Id = a.Branch_Id
AND b.Patient_Id = a.Patient_Id
AND b.Visit_Order = a.Visit_Order - 1
AND b.Visit_Date + 10 > a.Visit_Date
GROUP BY a.Hospital_Id, a.Patient_Id),
Hospital_Patient_Count (Hospital_Id, Patient_Count) as (
SELECT Hospital_Id, COUNT(DISTINCT Patient_Id)
FROM Hospital_Visits
GROUP BY Hospital_Id, Patient_Id)
SELECT a.Hospital_Id, b.Patient_Count, c.Recent_Visitor_Count
FROM Hospitals as a
LEFT JOIN Hospital_Patient_Count as b
ON b.Hospital_Id = a.Hospital_Id
LEFT JOIN Hospital_Recent_Visits as c
ON c.Hospital_id = a.Hospital_Id
请注意,这是针对DB2系统编写和测试的。我认为Oracle数据库具有相关功能,因此查询仍应按编写的方式工作。然而,DB2似乎缺少Oracle具有的一些OLAP功能(至少是我的版本),这可能有助于消除一些CTE。没有意识到您可以在Oracle中使用用例语句,只知道解码功能。为此干杯。不是100%确定您最内部的select得到了正确的数据,但是您的外部查询要优雅得多-很好。@APC如果添加了“延迟(med_分支)超过(按患者id顺序按日期划分)作为med_分支0”和“med_分支1=med_分支0”,我想这将是完整的。谢谢你的帮助,这是一段干净优雅的代码。谢谢你的三个答案,你真的很有帮助。