我的数据库实际上不是客户和订单,它是客户和眼科测试的处方(以防万一有人想知道为什么我希望我的客户不那么频繁地下订单!)
我有一个眼镜商链数据库,处方表有分支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万条记录。
答案 0 :(得分:7)
像这样的东西
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()
限制未来的测试处方。
答案 1 :(得分:1)
这个会有效地使用你当然应该拥有的(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
答案 2 :(得分:0)
途中:
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"
答案 3 :(得分:0)
自加入:
select a.branch, a.patient
from prescriptions a
join prescriptions b
on a.branch = b.branch
and a.patient = b.patient
and a.dateoftest > b.dateoftest
and a.dateoftest - b.dateoftest < 180
group by a.branch, a.patient
这假设您希望两次访问同一分支的患者。如果不这样做,请取出分支部分。
答案 4 :(得分:0)
SELECT Branch
,Patient
FROM (SELECT Branch
,Patient
,DateOfTest
,DateOfOtherTest
FROM Prescriptions P1
JOIN Prescriptions P2
ON P2.Branch = P1.Branch
AND P2.Patient = P2.Patient
AND P2.DateOfTest <> P1.DateOfTest
) AS SubQuery
WHERE DATEDIFF(day, SubQuery.DateOfTest, SubQuery.DateOfOtherTest) < 90