2014-08-28 85 views
0

例子说话最大声:SQL选择不在同一行汇总行中选择其他列的值

select date from prices 
where (Close-Open)/Open = 
    (select max((Close-Open)/Open) as daychange from prices); 

会给我正确的结果:

2008-09-17 

select max((close-open)/open) as daychange, date from prices; 

会给我:

0.1082868629230968 | 2014-08-27 

这显然不是我想要的。

任何更好或更干净的方式来做这个查询?我想以最大的价格变化来获得一天(百分比)。

+2

您没有在日期列上使用GROUP BY,因此它需要第一个日期值。所以,你的第一种方法是正确的,你只能在'JOIN'上改变你的'WHERE'子句。 – 2014-08-28 14:29:32

+1

我不是MySQL用户,但我很惊讶...如果您在选择中包含聚合函数和普通列引用而不指定适当的组,则MySQL不会抛出错误?它只是从它找到的第一行中提取非聚合表达式的数据值? – 2014-08-28 14:34:04

+0

'select max((close-open)/ open)as daychange,date from prices;'由于不正确的聚合使用,将被所有其他DBMS拒绝。 MySQL返回随机(他们称之为“不确定”)数据。有关详情,请参阅此处:http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html – 2014-08-28 14:35:16

回答

1

您正在使用集合函数max而不提供分组标准,因此您的表格价格将被视为一个组,并且查询结果将以不确定的顺序返回,这意味着它会为您提供标准的最大值,但它并不能保证你给它具有最高值,因此你的第二个查询可以写成

select 
((close-open)/open) as daychange, 
date 
from prices 
order by daychange desc 
limit 1 
; 

相关的日期,这样上面的查询将计算daychange每一行,它会排序在daychange值结果降序和限制为1会给你的标准和相关数据值的最大值