代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

如何在我得到的结果集中的sql查询中使用having子句

  •  0
  • Shantanu Gupta  · 技术社区  · 15 年前
    SELECT  
                P.PK_PatientId
                ,PV.PK_PatientVisitId
                --, PV.LastUpdated
                , ISNULL(P.FName,'')+ ', '+ ISNULL(P.LName,'') AS NAME
                , MAX(TVP.PK_VisitProcedureId) AS PK_VisitProcedureId
                , MAX(PV.LastUpdated)AS DateSort
            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)
                --  AND
                --PV.LastUpdated=GETDATE()
            GROUP BY PK_PatientId, PK_PatientVisitId, ISNULL(P.FName,'')+ ', '+ ISNULL(P.LName,'')--, PV.LastUpdated
            --HAVING MAX(TVP.PK_VisitProcedureId)=PK_VisitProcedureId
            ORDER BY 
                P.PK_PatientId DESC
                , DateSort DESC
                ,PV.PK_PatientVisitId DESC
    
    PK_PatientId PK_PatientVisitId NAME                  PK_VisitProcedureId    DateSort
    ------------ ----------------- --------------------  ------------------- -----------------------
    3            5                 TRAVIS, BARKER           8                   2010-08-31 00:00:00.000
    3            3                 TRAVIS, BARKER           6                   2010-08-31 00:00:00.000
    2            2                 BRIAN, IGNOTOWICZ        5                   2010-08-23 00:00:00.000
    1            4                 WILLIAM, HENWOOD         7                   2010-08-31 00:00:00.000
    1            1                 WILLIAM, HENWOOD         4                   2010-08-31 00:00:00.000
    
    (5 row(s) affected)
    

    PK\ U访问程序 是结果集中的最大值。

    所需结果集为

    PK_PatientId PK_PatientVisitId NAME                  PK_VisitProcedureId    DateSort
    ------------ ----------------- --------------------  ------------------- -----------------------
    3            5                 TRAVIS, BARKER           8                   2010-08-31 00:00:00.000
    2            2                 BRIAN, IGNOTOWICZ        5                   2010-08-23 00:00:00.000
    1            4                 WILLIAM, HENWOOD         7                   2010-08-31 00:00:00.000
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Michael Pakhantsov    15 年前
    SELECT PK_PatientId, PK_PatientVisitId, NAME, PK_VisitProcedureId, DateSort
    FROM   (SELECT t.*, ROW_NUMBER() OVER(PARTITION BY PK_PatientId ORDER BY    
            PK_VisitProcedureId DESC) r
         FROM   (SELECT P.PK_PatientId, PV.PK_PatientVisitId,
                         ISNULL(P.FName, '') + ', ' + ISNULL(P.LName, '') AS NAME,
                         MAX(TVP.PK_VisitProcedureId) AS PK_VisitProcedureId,
                         MAX(PV.LastUpdated) AS DateSort
                  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,
                            ISNULL(P.FName, '') + ', ' + ISNULL(P.LName, '')
                  ORDER  BY P.PK_PatientId DESC, DateSort DESC, PV.PK_PatientVisitId DESC
      ) t ) e
      WHERE  r = 1;
    

    您还可以尝试:(子查询选择每个患者的最新就诊)

     SELECT P.PK_PatientId, PV.PK_PatientVisitId,
             ISNULL(P.FName, '') + ', ' + ISNULL(P.LName, '') AS NAME,
             MAX(TVP.PK_VisitProcedureId) AS PK_VisitProcedureId, DateSort
      FROM   (SELECT PV.FK_PatientId PatientId, MAX(PK_PatientVisitId) PatientVisitId,
                      MAX(PV.LastUpdated) AS DateSort
               FROM   dbo.M_PatientVisit AS PV AND (PV.IsActive = 1)
               GROUP  BY PV.FK_PatientId) AS LatestVisits, M_Patient AS p, TX_VisitProcedure AS tvp
      WHERE  p.PK_PatientId = LatestVisits.PatientId
      AND    tvp.FK_PatientVisitId = LatestVisits.PatientVisitId
      AND    (P.IsActive = 1)
      AND    (TVP.IsActive = 1)
      GROUP  BY PK_PatientId, PK_PatientVisitId, ISNULL(P.FName, '') + ', ' + ISNULL(P.LName, ''),
                DateSort
      ORDER  BY 1 DESC, DateSort DESC