2010-11-23 19 views
0

私は現在の注文、SQL Serverの各グループ内でのTOP(1)の行を取得する方法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 

クエリに基づいて、各PK_PatientIdのトップ1行を選択する場所からのデータの一部、次のセットを持っていますそれがこの結果に私を導く

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に移行する必要があります。

望ましい結果は、私が唯一のSQL Server 2000を使用して同じ結果をするSQL 2005でROW_NUMBERを使用しているとき、私は取得しています

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 

です。

私はあなたがちょうどあなたのWHERE句の最後にこれをストラップに必要SQL 2000

答えて

1

使用する必要があります:「患者を返すクエリの結果であろう...

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

をより高いIDを持つその患者のための別の訪問が存在しない患者のための訪問 " - すなわち、あなたは最高のIDで訪問を得るでしょう。などあなたはビットがアクティブであることを確認するために、このサブクエリのWHERE句内の他のロジックを含める必要がありますことを

+0

これはうまくいきました。私はそれについて考えなかった。私はグループの中でTOP(1)に焦点を当てていました。私は患者の各グループでTOP(1)行を取得することを考えていたので。しかし、それは良い仕事をしました。 –

+0

確かに、このサブクエリに含まれる他のすべての条件が必要です。そうでないと、後で "アクティブ"でない訪問を選択する可能性があります。 –

+0

@Damien - 投稿した時点で投稿を編集していました。 –

0

は、あなたの手順で一時テーブルを使用して気にしませんか?私はあなたが一時テーブルに最大(PatientVisitId)の行を挿入できることを意味します。

+0

それは良いアプローチではありません。それはできますが、物事は少し複雑になります。ウィルの答えを見てください。出来た。まだ質問はまだ開いています。私はそれが他の技術によっても解決されるかもしれないと思う。 –

関連する問題