我的数据库实际上不是客户和订单,而是客户和眼睛测试的处方(以防有人想知道为什么我希望我的客户不那么频繁地下订单!)
我有一个眼镜连锁店的数据库,处方表中有分店ID号、患者ID号和他们检查眼睛的日期。随着时间的推移,患者将在数据库中列出不止一项视力测试。我如何才能获得在六个月内在系统中输入超过一次处方的患者列表。换句话说,如果一个处方的日期是,例如,在同一患者的前一个处方的日期的三个月内。
示例数据:
Branch Patient DateOfTest
1 1 2007-08-12
1 1 2008-08-30
1 1 2008-08-31
1 2 2006-04-15
1 2 2007-04-12我不需要知道结果集中的实际日期,也不一定要精确到三个月,只需要知道与以前的处方太接近的患者列表。在给定的示例数据中,我希望查询返回:
Branch Patient
1 1这种类型的查询不会经常运行,所以我并不过分担心效率。在我们的实时数据库中,处方表中有25万条记录。
发布于 2009-02-19 12:28:04
像这样的东西
select p1.branch, p1.patient
from prescription p1, prescription p2
where p1.patient=p2.patient
and p1.dateoftest > p2.dateoftest
and datediff('day', p2.dateoftest, p1.dateoftest) < 90;应该……您可能想要添加
and p1.dateoftest > getdate()以限制未来的测试处方。
发布于 2009-02-19 12:33:25
这将有效地使用(Branch, Patient, DateOfTest)上的索引,这当然是您应该拥有的:
SELECT Patient, DateOfTest, pDate
FROM (
SELECT (
SELECT TOP 1 DateOfTest AS last
FROM Patients pp
WHERE pp.Branch = p.Branch
AND pp.Patient = p.Patient
AND pp.DateOfTest BETWEEN DATEADD(month, -3, p.DateOfTest) AND p.DateOfTest
ORDER BY
DateOfTest DESC
) pDate
FROM Patients p
) po
WHERE pDate IS NOT NULL发布于 2009-02-19 12:26:08
在路上:
select d.branch, d.patient
from data d
where exists
( select null from data d1
where d1.branch = d.branch
and d1.patient = d.patient
and "difference (d1.dateoftest ,d.dateoftest) < 6 months"
);此部分需要更改-我不熟悉SQL Server的日期操作:
"difference (d1.dateoftest ,d.dateoftest) < 6 months"https://stackoverflow.com/questions/565040
复制相似问题