2010-09-15 3 views
0
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) 

La requête ci-dessus me renvoie le résultat donné ci-dessus. Je souhaite obtenir uniquement des lignes distinctes pour chaque patient où PK_VisitProcedureId est le maximum dans le jeu de résultats. Je pense que cela peut être fait en utilisant la clause Having dans la requête ci-dessus mais pas été en mesure de l'obtenir.comment utiliser la clause having dans sql dans mon jeu de résultats que j'obtiens

set Résultat souhaité est

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 
+0

'MAX (VisitProcedureId)' pourrait être une odeur - ne devriez-vous pas effectuer une recherche sur 'MAX (VisitProcedure__DATE)' ou similaire? – onedaywhen

+0

@onedaywhen: vous avez raison de regarder les noms. Mais pour ma part avec la logique métier. J'ai mis en application juste selon notre conception de base de données. –

Répondre

2
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; 

vous pouvez aussi essayer: (sous-requête Dern visites pour chaque patient)

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 
+0

@Michael: N'est-il pas possible d'avoir la clause. Je m'attends à ce que cela puisse être fait en utilisant la clause Having et ne nécessite pas de requête imbriquée ou corelée. C'est possible. –

+0

@Shantanu Gupta, probablement il est possible si vous fournissez quelques détails, requête ressemble à ce que vous essayez de sélectionner les patients et leur procédure lors de la dernière visite. (Corrigez-moi si je me trompe). –

+0

@Michael: oui vous avez raison. J'essaie de faire exactement ce que vous pensez –

Questions connexes