2009-11-20 80 views
1

該查詢T-Sql,如何獲得這些結果?

 SELECT PA.refPatient_id 
      ,MAX(PA.datee) AS datee 
      ,PR.temporary,PA.statue 

     FROM PatientClinicActs AS PA 
      ,PatientStatueReasons AS PR 

     WHERE PA.refClinic_id = 25 
     AND PA.refreason_id = PR.reason_id 

    GROUP BY PA.refPatient_id,PA.statue,PR.temporary 

返回這些結果:

refPatient_id datee     temporary statue 
----------- ----------------------- ------ ----- 
14706  2008-12-01 11:01:00  1  0 
14707  2009-05-18 16:21:00  1  0 
14708  2009-07-15 09:46:00  1  0 
14708  2009-07-29 16:12:00  1  0 
14716  2009-11-09 12:29:00  0  0 
14716  2009-09-01 11:15:00  1  0 
14716  2009-09-29 16:44:00  1  1 

但我想有以下結果:

refPatient_id datee     temporary statue 
----------- ----------------------- ------ ----- 
14706  2008-12-01 11:01:00  1  0 
14707  2009-05-18 16:21:00  1  0 
14708  2009-07-29 16:12:00  1  0 
14716  2009-11-09 12:29:00  0  0 

的區別是什麼? =>在這些結果中,每個refPatient_id都有最新的行。 我應該運行什麼來獲得這些結果?

+0

你想獲得最新的一個給定refPatient_Id?做一個rank()並選擇rank == 1應該工作的位置 – 2009-11-20 11:52:08

+0

我想獲取每個refPatient_id的最新行。你能寫一個排名榜嗎? – uzay95 2009-11-20 12:34:56

+0

您的14708結果:他們在第一個結果集中看起來不對。您不應該使用那個查詢結果 – gbn 2009-11-20 12:35:06

回答

3

嘗試是這樣的

SELECT PA.refPatient_id, 
     PA.datee, 
     PR.temporary, 
     PA.statue 
FROM PatientClinicActs AS PA INNER JOIN 
     (
      SELECT PA.refPatient_id, 
        MAX(PA.datee) AS datee 
      FROM PatientClinicActs AS PA 
      WHERE PA.refClinic_id = 25   
      GROUP BY PA.refPatient_id,PA.statue,PA.datee, 
     ) AS MaxDates ON PA.refPatient_id = MaxDates.refPatient_id AND PA.datee = MaxDates.datee INNER JOIN 
     PatientStatueReasons AS PR ON PA.refreason_id = PR.reason_id 

你需要讓每名患者的最大日期,然後再加入了這一點。

+0

對於某些患者它仍然有不止一行。 – uzay95 2009-11-20 11:56:45

+0

Tha可能是由於PatientClinicActs中出現多次MAX日期或包含針對患者的多個入口的PatientStatueReasons的鏈接,在這種情況下,您必須決定如何選擇適當的記錄。什麼使它成爲你需要的一個? – 2009-11-20 12:01:16

+0

我投你失望是因爲我誤讀了......顯然無法撤銷它,所以我投你一票'爲了公平而以最高價格檢索行' – Peter 2009-11-20 12:07:04

-2

就拿PA.datee出一批by子句

+0

它沒有工作。 – uzay95 2009-11-20 11:52:45

1

取而代之的是交叉的加入

FROM PatientClinicActs AS PA 
       ,PatientStatueReasons AS PR 

,你可以嘗試用內部聯接

FROM PatientClinicActs AS PA 

INNER JOIN PatientStatueReasons AS PR 

ON PA.refreason_id = PR.reason_id 

WHERE PA.refClinic_id = 25 
+0

即使它不能解決問題,也能爲好的做法+1 +1 – gbn 2009-11-21 09:20:50

+0

非常感謝您的先生。我從你身上學到了很多東西,並且還在學習中。你的評論對我來說總是很有價值。再次感謝 – 2009-11-21 10:41:32

+0

它不是交叉連接 - 它是使用非ANSI JOIN語法的內部連接。 – 2009-11-23 05:00:45

0

對於這種情況下,還有另外一種方法,通過使用SQL Server Ranking functions得到最新記錄。

我已經使用DENSE_RANK()作爲我的答案,但您可以使用RANK(),而不是您的特定問題。
:下面的代碼沒有進行測試。如果你是爲表提供的模式,我會用樣本數據進行測試)

;with RankedResult as (
    SELECT 
    PA.refPatient_id 
    , PA.datee 
    , PR.temporary, 
    , PA.statue 
    --; Last datee has the lowest rank value of 1, 
    , dense_rank() over 
     (partition by PA.refPatient_id order by PA.datee desc) as [Rank] 
    FROM PatientClinicActs AS PA 
      join PatientStatueReasons AS PR on PA.refreason_id = PR.reason_id 
    WHERE PA.refClinic_id = 25 
) 
select distinct * 
from RankedResult 
--; Get only the last result. 
where [Rank] = 1