SQL - 其中日期 = 最大日期
SQL - where date = max date
一段时间以来,我一直在努力解决这个问题,但似乎对我没有任何帮助,也许一点帮助可以帮助我更好地理解它。我正在加入多个表,但只想要与 ID 号关联的最大日期。一个 ID 号可能有多个日期。如果我取出 MAX(Date) 块,它将 运行 但 return 多个日期值。我不希望 MAX(Date) 在最初的 select 中,但只在 WHERE 子句中。这是我的查询:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
--Need help here to only return MAX date value:
AND C.Date=(SELECT MAX(C.Date) FROM Update2)
ORDER BY A.ID
我想你只是想要聚合:
SELECT A.ID, MAX(C.Date)
FROM IDTable A INNER JOIN
AccountTable B
ON B.AccountID = A.AccountID FULL OUTER JOIN
Updates U
ON U.ID = A.ID FULL OUTER JOIN
Update2 C
ON C.AccountID = B.AccountID INNER JOIN
UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete', 'Open')
GROUP BY A.ID;
我不知道您为什么要使用 FULL OUTER JOIN
,更不知道为什么要将它们与 INNER JOIN
混合使用。我怀疑你真的想要 LEFT JOIN
.
在 SQL 服务器中,使用 ROWNUMBER..
;with cte
as
(
SELECT A.ID , C.Date,row_number() over (partition by a.id order by c.date desc) as rn
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
)
select id,date from cte where rn=1
如果您不想在初始 Select 中使用 MAX(date),那么这会起作用:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
AND C.Date=
(SELECT MAX(C2.Date)
FROM Update2 C2
WHERE C2.AccountID = C.AccountID)
ORDER BY A.ID
这是我的看法。对于复杂的查询,总是有多种解决方案...
首先,获取每个 AccountID 的最新日期
select AccountID, max(Date)
from Update2
group by AccountID
将其粘贴到子查询中,返回 table 以仅获取 "latest" 条目
select CInner.*, CMax.MaxDate
from Update2 CInner
inner join (-- Max date for every AccountID
select AccountID, max(Date) MaxDate
from Update2
group by AccountID) CMax
on CMax.AccountID = CInner.AccountID
and CMax.MaxDate = CInner.Date
将其插入原始查询。
将其全部设为子查询以保持 Full Outer Join 不同
(为了便于理解,我还将内部连接移动到了一起)
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN (-- Update2, with latest date
select CInner.*, CMax.MaxDate
from Update2 CInner
inner join (-- Max date for every AccountID
select AccountID, max(Date) MaxDate
from Update2
group by AccountID) CMax
on CMax.AccountID = CInner.AccountID
and CMax.MaxDate = CInner.Date) C
ON C.AccountID = B.AccountID
WHERE A.StatusID NOT IN ('Complete','Open')
--Need help here to only return MAX date value:
AND C.Date=(SELECT MAX(C.Date) FROM Update2)
ORDER BY A.ID
这是我能做到的。这里的问题是所有 JOIN 都将在 WHERE 子句之前得到解决,因此在当前形式中,所有这些 FULL OUTER JOIN 都是毫无意义的,因为只有那些具有 max(Date) 的结果行才会被包括在内。
另外,我发现使用完全外部联接的查询很难正确处理。事实上,您的查询中有两个,这让我的眼睛湿润了,而且它们 "branch off" 是您的核心内部联接查询。您确定他们需要在那里吗?
一段时间以来,我一直在努力解决这个问题,但似乎对我没有任何帮助,也许一点帮助可以帮助我更好地理解它。我正在加入多个表,但只想要与 ID 号关联的最大日期。一个 ID 号可能有多个日期。如果我取出 MAX(Date) 块,它将 运行 但 return 多个日期值。我不希望 MAX(Date) 在最初的 select 中,但只在 WHERE 子句中。这是我的查询:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
--Need help here to only return MAX date value:
AND C.Date=(SELECT MAX(C.Date) FROM Update2)
ORDER BY A.ID
我想你只是想要聚合:
SELECT A.ID, MAX(C.Date)
FROM IDTable A INNER JOIN
AccountTable B
ON B.AccountID = A.AccountID FULL OUTER JOIN
Updates U
ON U.ID = A.ID FULL OUTER JOIN
Update2 C
ON C.AccountID = B.AccountID INNER JOIN
UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete', 'Open')
GROUP BY A.ID;
我不知道您为什么要使用 FULL OUTER JOIN
,更不知道为什么要将它们与 INNER JOIN
混合使用。我怀疑你真的想要 LEFT JOIN
.
在 SQL 服务器中,使用 ROWNUMBER..
;with cte
as
(
SELECT A.ID , C.Date,row_number() over (partition by a.id order by c.date desc) as rn
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
)
select id,date from cte where rn=1
如果您不想在初始 Select 中使用 MAX(date),那么这会起作用:
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN Update2 C
ON C.AccountID = B.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
WHERE A.StatusID NOT IN ('Complete','Open')
AND C.Date=
(SELECT MAX(C2.Date)
FROM Update2 C2
WHERE C2.AccountID = C.AccountID)
ORDER BY A.ID
这是我的看法。对于复杂的查询,总是有多种解决方案...
首先,获取每个 AccountID 的最新日期
select AccountID, max(Date)
from Update2
group by AccountID
将其粘贴到子查询中,返回 table 以仅获取 "latest" 条目
select CInner.*, CMax.MaxDate
from Update2 CInner
inner join (-- Max date for every AccountID
select AccountID, max(Date) MaxDate
from Update2
group by AccountID) CMax
on CMax.AccountID = CInner.AccountID
and CMax.MaxDate = CInner.Date
将其插入原始查询。 将其全部设为子查询以保持 Full Outer Join 不同 (为了便于理解,我还将内部连接移动到了一起)
SELECT DISTINCT A.ID , C.Date
FROM IDTable A
INNER JOIN AccountTable B
ON B.AccountID = A.AccountID
INNER JOIN UserTable UT
ON UT.UserMnemonicID = A.AssignedTo
FULL OUTER JOIN Updates U
ON U.ID = A.ID
FULL OUTER JOIN (-- Update2, with latest date
select CInner.*, CMax.MaxDate
from Update2 CInner
inner join (-- Max date for every AccountID
select AccountID, max(Date) MaxDate
from Update2
group by AccountID) CMax
on CMax.AccountID = CInner.AccountID
and CMax.MaxDate = CInner.Date) C
ON C.AccountID = B.AccountID
WHERE A.StatusID NOT IN ('Complete','Open')
--Need help here to only return MAX date value:
AND C.Date=(SELECT MAX(C.Date) FROM Update2)
ORDER BY A.ID
这是我能做到的。这里的问题是所有 JOIN 都将在 WHERE 子句之前得到解决,因此在当前形式中,所有这些 FULL OUTER JOIN 都是毫无意义的,因为只有那些具有 max(Date) 的结果行才会被包括在内。
另外,我发现使用完全外部联接的查询很难正确处理。事实上,您的查询中有两个,这让我的眼睛湿润了,而且它们 "branch off" 是您的核心内部联接查询。您确定他们需要在那里吗?