为现有查询选择最大值

发布于 2024-10-07 13:27:51 字数 1723 浏览 0 评论 0原文

首先,这是我的代码

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

,基本上以这种格式返回数据

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*

正如您可能已经猜到的那样,我需要为每个 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

任何帮助都会很棒。我可以作弊并将其变成一个视图,然后再做另一个视图,但我想尽可能干净

firstly, here's my code

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 back data in this format

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*

As you may have guessedm I need to pick out the last entry for each pID so in this case, I need

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

Any help would be great. I could cheat and turn this into a view and then do another view but I want to be as clean as possible

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

紫南 2024-10-14 13:27:51

不要直接 JOIN 到 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

Instead of the JOIN onto tblPatRecords directly, try replacing with a join onto a subquery, so e.g. replace your FROM clause to this:

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
木落 2024-10-14 13:27:51

如果您使用的是 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

If you are using SQL Server 2005 or 2008, then you can use the ROW_NUMBER function. Try this:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文