2010-12-16 119 views
1

首先,這裏是我的代碼選擇最大價值現有查詢

SELECT dbo.tblPat.pID, dbo.tblRec.rID, 
right(rPCheck, LEN(rPCheck) - (CHARINDEX('|', rPCheck))) as pCheck, 
right(rGP, LEN(rGP) - (CHARINDEX('|', rGP))) as GPCheck 
FROM 
dbo.tblPat INNER JOIN 
dbo.tblPatRecords ON dbo.tblPat.pID = dbo.tblPatRecords.pID INNER JOIN 
dbo.tblRec ON dbo.tblPatRecords.rID = dbo.tblRec.rID 
WHERE  
(DATEPART(dw, dbo.tblRec.rDateRecAdd) IN (5, 6, 7)) 
AND (dbo.tblRec.rGP <> N'0') 
AND (dbo.tblRec.rPCheck <> N'0') 
AND right(rPCheck, LEN(rPCheck) - (CHARINDEX('|', rPCheck))) > right(rGP, LEN(rGP) - (CHARINDEX('|', rGP))) 
ORDER BY dbo.tblPat.pID, dbo.tblRec.rID 

Whih basicallybrings回的數據以這種格式

39 366 26/06/2008 16:54:35 26/06/2008 15:04:53 
39 368 27/06/2008 09:33:55 27/06/2008 08:57:07 
39 369 27/06/2008 09:35:14 27/06/2008 08:57:07 
39 370 27/06/2008 09:36:34 27/06/2008 08:57:07 
39 371 27/06/2008 09:37:33 27/06/2008 08:57:07 
39 372 27/06/2008 09:37:33 27/06/2008 08:57:07 
39 373 27/06/2008 09:37:33 27/06/2008 08:57:07 
39 374 27/06/2008 09:37:33 27/06/2008 08:57:07 
*39 397 27/06/2008 13:13:49 27/06/2008 12:48:25* 
92 46310 19/08/2008 15:52:50 03/10/2008 14:50:00 
92 46313 19/08/2008 15:52:50 03/10/2008 14:52:50 
92 46315 19/08/2008 15:52:50 03/10/2008 14:52:50 
92 46558 19/08/2008 15:52:50 03/10/2008 19:26:04 
92 46559 19/08/2008 15:52:50 03/10/2008 19:26:04 
92 46623 04/10/2008 10:46:39 03/10/2008 19:26:04 
*92 46632 04/10/2008 10:46:39 03/10/2008 19:26:04* 

正如你可能已經guessedm我需要挑選出最後進入每個pID所以在這種情況下,我需要

39 397 27/06/2008 13:13:49 27/06/2008 12:48:25 
92 46632 04/10/2008 10:46:39 03/10/2008 19:26:04 

任何幫助將是偉大的。我可以作弊並將其轉化爲視圖,然後再做另一個視圖,但我希望儘可能乾淨

+0

通過條目您是否想要查看每個pID中具有最高rID的所有列,或者您的意思是您只是想知道每個pID的最高rID? – 2010-12-16 09:37:56

+0

任何一個 - 所有列可能會更有用,但我可以只使用每個pID的最高rID – pee2pee 2010-12-16 10:02:03

+0

您使用的是什麼SQL Server版本?,2000,2005或2008? – Lamak 2010-12-16 14:23:03

回答

3

而不是直接連接到tblPatRecords,請嘗試用聯接替換爲子查詢,例如,將FROM子句替換爲:

FROM dbo.tblPat INNER JOIN 
(
    SELECT pID, MAX(rID) AS rID 
    FROM dbo.tblPatRecords 
    GROUP BY pID 
) t ON dbo.tblPat.pID = t.pID 
INNER JOIN dbo.tblRec ON t.rID = dbo.tblRec.rID 
+0

我做了替換,我沒有回來: (39 397 27/06/2008 13:13:49 27/06/2008 12:48:25) (92 46632 04/10/2008 10: 46:39 03/10/2008 19時26分04秒) 我得到 (150 \t \t 3092 2008年4月7日14時27分○○秒\t 2008年4月7日14時20分26秒) (218 17/07/2008 14:54:51 \t 17/07/2008 12:17:00) – pee2pee 2010-12-16 09:59:49

+0

嗯,不要做我需要的東西 – pee2pee 2010-12-16 12:35:43

2

如果您使用SQL Server 2005或2008,則可以使用ROW_NUMBER函數。試試這個:

WITH Results AS (
SELECT dbo.tblPat.pID, dbo.tblRec.rID, 
     RIGHT(rPCheck, LEN(rPCheck) - (CHARINDEX('|', rPCheck))) as pCheck, 
     RIGHT(rGP, LEN(rGP) - (CHARINDEX('|', rGP))) as GPCheck, 
     ROW_NUMBER() OVER(PARTITION BY dbo.tblPat.pID ORDER BY dbo.tblRec.rID DESC) Id 
FROM dbo.tblPat 
INNER JOIN dbo.tblPatRecords 
ON dbo.tblPat.pID = dbo.tblPatRecords.pID 
INNER JOIN dbo.tblRec 
ON dbo.tblPatRecords.rID = dbo.tblRec.rID 
WHERE (DATEPART(dw, dbo.tblRec.rDateRecAdd) IN (5, 6, 7)) 
AND (dbo.tblRec.rGP <> N'0') 
AND (dbo.tblRec.rPCheck <> N'0') 
AND right(rPCheck, LEN(rPCheck) - (CHARINDEX('|', rPCheck))) > right(rGP, LEN(rGP) - (CHARINDEX('|', rGP))) 
) 

SELECT * 
FROM Results 
WHERE Id = 1 
+0

很酷的把戲!謝謝 – 2010-12-16 14:50:56