sql查询找到太频繁订购的客户?

时间:2009-02-19 12:17:28

标签: sql sql-server tsql

我的数据库实际上不是客户和订单,它是客户和眼科测试的处方(以防万一有人想知道为什么我希望我的客户不那么频繁地下订单!)

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

5 个答案:

答案 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