【问题标题】:SQL - Getting Most Recent Date From Multiple ColumnsSQL - 从多列中获取最近的日期
【发布时间】:2010-06-03 15:38:39
【问题描述】:

假设行集包含以下内容

EntryID    Name      DateModified   DateDeleted
-----------------------------------------------  
1          Name1     1/2/2003       NULL
2          Name1     1/3/2005       1/5/2008
3          Name1     1/3/2006       NULL
4          Name1     NULL           NULL  
5          Name1     3/5/2008       NULL

澄清:

我需要一个值 - 两列中最大的非空日期。所以在这种情况下,所有十个单元格中最大的一个。

【问题讨论】:

  • 您是要从 either DateModified DateDeleted 中获取最大值,还是要为每个 取最大值列?
  • @OMG - 这有什么不同吗? @Thomas - 我已经编辑了我的问题;两列中只有一个值
  • 我认为@OMG 提出问题的原因是想知道GREATEST 功能是否可用。

标签: sql


【解决方案1】:
SELECT MAX(CASE WHEN (DateDeleted IS NULL OR DateModified > DateDeleted)
                THEN DateModified ELSE DateDeleted END) AS MaxDate
FROM Table

【讨论】:

  • 我认为应该是CASE WHEN ISNULL(DateModified, 0) > ISNULL(DateDeleted, 0)
【解决方案2】:

对于 MySQL、Postgres 或 Oracle,使用 GREATEST 函数:

SELECT GREATEST(ISNULL(t.datemodified, '1900-01-01 00:00:00'),  
                ISNULL(t.datedeleted, '1900-01-01 00:00:00'))
  FROM TABLE t

如果提供了 NULL,Oracle 和 MySQL 都将返回 NULL。该示例使用 MySQL 空值处理 - 相应地更新相应的数据库。

与数据库无关的替代方案是:

SELECT z.entryid,
       MAX(z.dt)
  FROM (SELECT x.entryid,
               x.datemodified AS dt
          FROM TABLE x
        UNION ALL
        SELECT y.entryid
               y.datedeleted AS dt
          FROM TABLE y) z
GROUP BY z.entryid

【讨论】:

  • +1 我不知道GREATEST 函数,另外,我喜欢你的数据库无关解决方案。 =)
  • +1 表示GREATEST 函数。这让事情变得容易多了(假设他的数据库支持它)!
  • 您的第一个解决方案不起作用。 1)Greatest不是聚合函数,它每行返回一个结果,所以需要MAX(GREATEST(...) 2)除了(至少在Oracle上)GREATEST(some_value, NULL)返回NULL,所以不能满足OP的特定需求。
  • 仅供参考:SQLite GREATEST 等价物(SQL Server 或 MySQL 不支持):stackoverflow.com/questions/2166690/…
  • @Shannon Severance:OP 没有要求汇总。如果比较日期,MySQL 也会返回 NULL;我提供了 MySQL 语法,因为它是最有可能的供应商。
【解决方案3】:

作为一般解决方案,您可以尝试以下方法:

select max(date_col)
from(
  select max(date_col1) AS date_col from some_table
  union
  select max(date_col2) AS date_col from some_table
  union
  select max(date_col3) AS date_col from some_table
  ...
)

可能有更简单的方法,具体取决于您使用的数据库。

【讨论】:

    【解决方案4】:

    怎么样;

    SELECT MAX(MX) FROM (
        SELECT MAX(DateModified) AS MX FROM Tbl
        UNION
        SELECT MAX(DateDeleted) FROM Tbl
    ) T
    

    【讨论】:

    • 简单,适用于大多数数据库和多个表。
    【解决方案5】:

    答案取决于你真正想要什么。如果您只是想要两个日期值中的最新值,那么您可以这样做:

    Select Max(DateModified), Max(DateDeleted)
    From Table
    

    如果您要求 任一列 中的最大值,那么您可以简单地这样做:

    Select Case 
            When Max(DateModified) > Max(DateDeleted) Then Max(DateModified)
            Else Max(DateDeleted)
            End As MaxOfEitherValue
    From Table
    

    【讨论】:

      【解决方案6】:

      以上均为有效答案;

      但我不确定这是否可行?

      select IsNull((
                      select MAX(DateModified) 
                      from table
                    )
                   ,
                    (
                       select MAX(DateDeleted) 
                       from table
                    )
                   )     as MaxOfEitherValue
      from    table 
      

      编辑 1:

      今天早上洗澡的时候,我有另一个解决方案:

      解决方案 2:

        select MAX(v) from (
                             select MAX(DateModified) as v from table
                             union all
                             select MAX(DateDeleted) as v from table
                           ) as SubTable
      

      编辑 3:

      该死,刚刚发现这与 Alex k 的解决方案相同。叹息……

      【讨论】:

      • 不,这在两者都不为空的情况下不起作用。 from table 也意味着它将返回多行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多