2009-02-19 68 views
4

我的数据库实际上并不是客户和订单,它是客户和眼科测试的处方(以防万一有人想知道为什么我希望我的客户下订单的频率更低)查询sql查询客户订单频繁吗?

我有一个数据库一个眼镜商链,处方表具有分支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万条记录。

回答

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() 

限制未来的测试处方。

+0

你先生,是一个学者和绅士:-) – Dan 2009-02-19 12:45:37

+0

谢谢:)但我赚了什么绅士的一部分? – tehvan 2009-02-20 06:03:07

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" 
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 
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 

这是假设你想要谁访问同一分支两次的患者。如果你不这样做,拿出分支部分。

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