【问题标题】:Aggregate function in result in oracle 11goracle 11g 中的聚合函数
【发布时间】:2014-05-09 12:38:16
【问题描述】:

任何人都可以告诉我聚合函数最大值对于相同值的结果是什么? 假设我有一个 creation_date 列,其中包含日期为 varchar2 。如果我尝试 max(creation_date) 将得到什么结果以及它将如何选择行。如果在 where 子句子查询中使用它,行是可预测的吗?

完整的查询是这样的。

create id from my_table where create_date=(select max(create_date) from my table);

【问题讨论】:

  • 你想达到什么目的?如果你想得到最新的日期,那么MAX(create_date) 不会给你你想要的。您需要先将varchar2 转换为date
  • 好的..你给我提示。我只想知道如果每个值都相同,oracle聚合函数如何选择任何行
  • 它将返回其中一个值(它将始终返回一个值),但是无法预测它将返回其中哪一个。示例:SELECT MAX(col) FROM tbl 其中tbl.col 的值为 (1, 2, 1, 4),它将返回 1。现在是第一行还是第三行的 1?没办法说。

标签: oracle11g oracle-sqldeveloper database-administration


【解决方案1】:

不太确定您要实现什么目标。 假设有一个表 my_table ,其数据如下所示。 (注意最后两行在日期列中的数据相同)

SQL> 从 my_table 中选择 *;

 CREATE_ID CREATE_DATE         CREATE_DATE_VARCHAR
---------- ------------------- --------------------
         1 1996-07-25 00:00:00 1996-07-25 00:00:00
         2 1997-07-26 00:00:00 1997-07-26 00:00:00
         3 2013-07-26 00:00:00 2013-07-26 00:00:00
         4 2013-07-26 00:00:00 2013-07-26 00:00:00

如果你执行select * from my_table where create_date_varchar=(Select max(create_date_varchar) from my_table);,那么你会得到2条记录(id 3和4)

 CREATE_ID CREATE_DATE         CREATE_DATE_VARCHAR
---------- ------------------- --------------------
         3 2013-07-26 00:00:00 2013-07-26 00:00:00
         4 2013-07-26 00:00:00 2013-07-26 00:00:00

如果您只想选择一个,则可以使用 ROWNUM=1 select * from my_table where create_date_varchar=(Select max(create_date_varchar) from my_table) and ROWNUM = 1; 那么你会得到 1 条记录(3 条或 4 条,这可以通过使用 order 子句来控制)

检查:http://sqlfiddle.com/#!4/8d75a/3

参考Max Function 要了解有关排序如何工作的更多信息,请参阅 NLS_SORTWhy does Oracle's varchar sort order not match the behavior of varchar comparison?

【讨论】:

  • @user3004656 这与我在 cmets 中对您的回答完全相同。然而,Kaushal 做出了额外的努力,为您构建了一个完整的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2013-02-13
  • 1970-01-01
  • 2012-06-24
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多