如何在sql server 2000中的每个组内获取TOP(1)行

时间:2010-11-23 07:38:23

标签: sql-server sql

我有一些以下数据集,我想根据当前订单为每个PK_PatientId选择前1行

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

导致我得到此结果的查询

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

2 个答案:

答案 0 :(得分: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的患者不存在另一次访问” - 也就是说,您将获得具有最高ID的访问。 / p>

请注意,您需要在此子查询的WHERE子句中包含其他逻辑,以确保这些位处于活动状态等。

答案 1 :(得分:0)

你介意在你的程序中使用临时表吗?我的意思是你可以将max(PatientVisitId)行插入临时表。