SQL - 其中date = max date

时间:2016-07-14 14:04:56

标签: sql date join max where

我一直试图想出这个问题一段时间,但似乎没有什么对我有用,也许一些帮助会帮助我更好地理解它。我正在加入多个表,但只希望与ID号相关联的最大日期。可能有多个日期与ID号相关联。如果我取出MAX(日期)片段,它将运行但返回多个日期值。我不希望MAX(Date)在初始选择中,而只在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

4 个答案:

答案 0 :(得分:3)

如果您不想在初始选择中使用MAX(日期),那么这将有效:

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

答案 1 :(得分:0)

我想你只想要聚合:

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

答案 2 :(得分:0)

在SQL Server中,使用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

答案 3 :(得分:0)

这是我的看法。对于复杂的查询,总有多种解决方案......

首先,获取每个AccountID的最新日期

try:
    doMyFavoriteThing()
except Exception as e:
    print str(e)

将其粘贴在子查询中,然后返回表格以获取“最新”条目

select AccountID, max(Date)
 from Update2
 group by AccountID

将其重新插入原始查询。 使所有子查询保持完全外部连接不同 (为了理解,我也将内连接移动到一起)

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

这是我可以去的地方。这里的问题是所有JOIN都将在WHERE子句之前解析,所以在当前形式中,所有那些FULL OUTER JOIN都是没有意义的,因为只包含那些带有max(Date)的结果行。

要提到的是,我发现具有完全外连接的查询很难做到正确。你的查询中有两个这样的事实让我的眼睛流水,而且当他们“分支”你的核心内部联接查询时也是如此。你明确他们需要在那里吗?