【问题标题】:Selecting two distinct column with one max date [duplicate]选择两个具有一个最大日期的不同列[重复]
【发布时间】:2017-04-17 17:28:45
【问题描述】:

我有一张这样的桌子:

ID  DATE        TableName  
X   29-Jan-12   A  
X   29-Feb-12   B  
X   29-Jan-12   C  
Y   18-Nov-12   A  
Z   18-Nov-14   C  
X   17-Nov-13   D  
Z   14-May-12   A  
Y   18-Nov-13   D  

我想用 MaxDate 获取唯一 ID,这样输出应该是这样的 -

ID  DATE    TableName  
Z   18-Nov-14   C  
Y   18-Nov-13   D  
X   17-Nov-13   D 

我正在使用select ID, MAX(DATE), TableName from table,但这并没有给我想要的输出。

【问题讨论】:

  • 您使用的是什么关系型数据库?
  • 这里的教训:如果您没有选择正确的数据库产品,其他产品的专家可能会关闭您的问题。 @Barmar 关闭了这个问题并链接到一个特定于 MySQL 的旧问题; Oracle(例如)中存在但 MySQL 中不存在的答案都没有显示在那个较旧的问题中,但谁在乎。显然不是 Barmar。
  • 这是一个 Oracle 副本:stackoverflow.com/questions/121387/…
  • 相关边栏中还有许多其他类似的问题。
  • @Barmar - OP 的教训仍然存在。始终注意标签,不要只使用默认设置。

标签: mysql sql oracle sybase


【解决方案1】:

您可以在子选择组上使用 in 子句 如果您使用的是允许元组的数据库

select id, date, tableName 
from my_table 
where (id, date) in (select id, max(date) 
                     from my_table 
                     group by id);

或者如果数据库不允许元组,你可以使用内部连接

select id, date, tableName 
from my_table a 
inner join ( select id, max(date) max_date 
                     from my_table 
                     group by id) t on t.id = a.id and  t.max_date = a.date;

【讨论】:

    【解决方案2】:

    甲骨文回答:

    您缺少的是选择与每个组中的max(date) 相对应的tablename

    使用keep (dense_rank last...) 可以最有效地完成此操作,如下所示:(注意 - DATE 是 Oracle 中的保留字,因此我希望您的列名不是 DATE,而您将其用作占位符...)

    select   id, max(date) as date, 
             max(tablename) keep (dense_rank last order by date) as tablename
    from     table_like_this
    group by id;
    

    Oracle 文档(对于 FIRST 但请阅读文本,它也指 LAST) https://docs.oracle.com/cloud/latest/db112/SQLRF/functions065.htm#SQLRF00641

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 2016-12-22
      • 2016-09-25
      • 1970-01-01
      • 2017-07-26
      • 2019-06-02
      相关资源
      最近更新 更多