2014-08-28 8 views
0

예는 가장 큰 소리로 말하는 :SQL은 집계 된 행과 같은 행에 다른 열의 값을 따기되지

2008-09-17 

그러나

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

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

나에게 올바른 결과를 줄 것이다

줄 것입니다 :

0.1082868629230968 | 2014-08-27 

내가 분명히 원하는 것은 아닙니다.

이 쿼리를 수행하는 더 좋은 방법이나 더 좋은 방법은 없을까요? 나는 가격 변화가 가장 큰 날을 원한다.

+2

당신은'Date' 칼럼에'GROUP BY'를 사용하지 않았기 때문에, date의 첫 번째 값을가집니다. 그래서 첫 번째 접근법이 옳다.'JOIN'에 대해서만'WHERE' 절을 변경할 수 있습니다. –

+1

저는 MySQL 사용자가 아니지만 놀랍습니다 ... 적절한 그룹을 지정하지 않고 select에 집계 함수와 일반 열 참조를 모두 포함하면 MySQL에서 오류가 발생하지 않습니다. 발견 된 첫 번째 행에서 집계되지 않은 표현식의 데이터 값을 가져옵니다. –

+0

'집계의 부정확 한 사용으로 인해 다른 모든 DBMS에 의해'선택이 최대 ((닫힘 - 열림/열림)을 일간, 날짜로부터 선택; MySQL은 무작위로 데이터를 반환합니다 ("불확정"이라고 함). 자세한 내용은 다음을 참조하십시오. http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html –

답변

1

그룹화 기준을 제공하지 않고 집계 함수 max을 사용하고 있으므로 테이블 가격이 하나의 그룹으로 취급되고 쿼리 결과가 불확정 순서로 반환되므로 조건에 대한 최대 값을 제공하지만 그것은 그래서 각 행에 대해 daychange을 계산합니다 위의 쿼리는 daychange의 값으로 결과를 정렬합니다 그래서 두 번째 쿼리가

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

과 같이 쓸 수있다 최대 값을 갖는 해당 날짜를주고 당신을 보장하지 않습니다 내림차순 및 1로 제한하면 기준 및 관련 데이터 값의 최대 값도 제공됩니다

관련 문제