2010-11-23 68 views
0

我有,我想根據目前的訂單如何獲得每個小組內TOP(1)排在SQL Server 2000

PK_PatientId PK_PatientVisitId PK_VisitProcedureId DateSort 
------------ ----------------- ------------------- ----------------------- 
1   4     4     2009-06-22 00:00:00.000 
1   3     3     2009-06-22 00:00:00.000 
1   2     2     2010-03-11 00:00:00.000 
1   1     1     2010-03-11 00:00:00.000 
5   6     6     2009-05-24 00:00:00.000 
5   5     5     2009-11-07 00:00:00.000 
7   7     7     2009-05-24 00:00:00.000 
8   8     8     2009-05-24 00:00:00.000 
9   9     9     2009-05-24 00:00:00.000 
10   10    10     2009-05-24 00:00:00.000 

查詢來選擇頂部1行每個PK_PatientId一些下面一組數據這導致我這個結果是

SELECT  
    P.PK_PatientId 
    , PV.PK_PatientVisitId 
    , MAX(TVP.PK_VisitProcedureId) AS PK_VisitProcedureId 
    , MAX(PV.LastUpdated) AS DateSort 
    --, Row_Number() OVER (Partition BY PK_PatientId ORDER BY PV.PK_PatientVisitId DESC) AS RowNo 
FROM   
    dbo.M_Patient AS P 
     INNER JOIN 
    dbo.M_PatientVisit AS PV 
      ON 
       P.PK_PatientId = PV.FK_PatientId 
     INNER JOIN 
    dbo.TX_VisitProcedure AS TVP 
      ON 
       PV.PK_PatientVisitId = TVP.FK_PatientVisitId 
WHERE  
    (P.IsActive = 1) 
     AND 
    (PV.IsActive = 1) 
     AND 
    (TVP.IsActive = 1) 
GROUP BY 
    PK_PatientId 
    , PK_PatientVisitId 
ORDER BY 
    PK_PatientId 
    , PK_PatientVisitId DESC 

我必須通過取得RowNo = 1來獲得行號功能,我正在做的其餘功能。但是現在我不得不把這個過程帶到SQL 2000中,因爲這個函數不能被使用。

期望的結果是

PK_PatientId PK_PatientVisitId PK_VisitProcedureId DateSort    RowNo 
------------ ----------------- ------------------- ----------------------- -------------------- 
1   4     4     2009-06-22 00:00:00.000 1 
5   6     6     2009-05-24 00:00:00.000 1 
7   7     7     2009-05-24 00:00:00.000 1 
8   8     8     2009-05-24 00:00:00.000 1 
9   9     9     2009-05-24 00:00:00.000 1 

在SQL 2005中ROW_NUMBER時我得到我想要只使用SQL 2000相同的結果。

我不得不使用SQL 2000

回答

1

你只需要錶帶給你的WHERE子句的末尾:

AND NOT EXISTS (
SELECT * 
FROM dbo.M_PatientVisit PV2 
WHERE P.PK_PatientId = PV2.FK_PatientId 
AND PV2.PK_PatientVisitId > PV.PK_PatientVisitId 
) 

...這將導致該查詢返回「病人對那些身份證號碼較高的患者不存在另一次訪問的患者進行訪問「 - 也就是說,您將獲得ID最高的訪問。

請注意,您必須包括WHERE子句中的其他邏輯在這個子查詢,以確保該位是活躍等

+0

工作。我沒有想過。我關注TOP(1)之間的團體。因爲我正在考慮在每組患者中進入TOP(1)行。但它工作很好。 – 2010-11-23 07:55:35

+0

當然,它需要包含在這個子查詢中的所有其他WHERE條件 - 否則,你可能會選擇一個不是「活躍」的訪問 – 2010-11-23 07:55:58

0

你不介意使用臨時表中的程序?我的意思是你可以插入max(PatientVisitId)行到一個臨時表中。