繁体   English   中英

如何在SQL Server 2000中的每个组中获取TOP(1)行

[英]How to get TOP (1) row within each Group in sql server 2000

我有一些以下数据集,从中我想根据当前顺序为每个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

您只需要将此附加到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最高的访问。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM