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" 是您的核心内部联接查询。您确定他们需要在那里吗?