【问题标题】:SQL - where date = max dateSQL - 其中日期 = 最大日期
【发布时间】:2016-07-14 14:04:56
【问题描述】:

我一直在尝试解决这个问题,但似乎对我没有任何帮助,也许一些帮助会帮助我更好地理解它。我要加入多个表,但只想要与 ID 号关联的最大日期。一个 ID 号可能有多个日期。如果我取出 MAX(Date) 部分,它将运行但返回多个日期值。我不希望 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

【问题讨论】:

  • 您使用的是什么类型的SQL 引擎?

标签: sql date join max where


【解决方案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

【讨论】:

  • 这就是我需要的。该查询准确地返回了我正在寻找的内容。看起来我没有为子查询表分配别名。谢谢
【解决方案2】:

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

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

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

将其插入到原始查询中。 将其全部设为子查询以保持完全外连接不同 (为了便于理解,我还将内部连接移到了一起)

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) 的结果行才会被包括在内。

另外,我发现完全外部连接的查询很难正确处理。您的查询中有两个这一事实使我的眼睛流泪,而且它们“分支”了您的核心内部连接查询。你确定他们需要在那里吗?

【讨论】:

  • 是的,Left Join 似乎是我需要的。仍在学习/理解两者之间的差异。
【解决方案3】:

我认为你只是想要聚合:

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

【讨论】:

  • 初始选择中的 MAX(C.Date) 在这里工作,但想在我会做 Count 的其他查询中使用 WHERE 子句项。所以希望弄清楚如何在 WHERE 子句中获取 MAX(C.date) 。我将看看使用 Left Join.. 尝试过 Inner Join,但它遗漏了值
【解决方案4】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多