2009-02-19 69 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