2012-11-20 2 views
1

2 열, 날짜 및 금액이있는 테이블이 있습니다. 나는 x day 피크를 찾을 수 있기를 원해. 따라서 다음 표가 있고 3 일간의 봉우리를 찾으려고 할 때, 그 날짜가 선택되기 전후의 3 일 동안 그 날보다 의미있는 금액이 하루 더 높습니다. 내가 사용 시도 2012년 9월 10일을 선택해야날짜 및 금액 열이있는 테이블에서 최대 금액 날짜를 선택하는 방법

date   amount 
2012-09-04 | 53137.47 
2012-09-05 | 53137.2 
2012-09-06 | 53137.54 
2012-09-07 | 53138.58 
2012-09-10 | 53138.73 
2012-09-11 | 53138.28 
2012-09-12 | 53138.22 
2012-09-13 | 53138.48 
2012-09-14 | 53140.14 
2012-09-17 | 53139.82 
2012-09-18 | 53139.86 
2012-09-19 | 53140.01 
2012-09-20 | 53139.75 
2012-09-21 | 53139.82 
2012-09-24 | 53139.01 
2012-09-25 | 53138.93 
2012-09-26 | 53138.48 
2012-09-27 | 53138.83 
2012-09-28 | 53138.62 

, 2012년 9월 14일

조인 및 테이블을 유도하지만 난 그것을 얻이 수없는 것.

다음과 같은 시도 :

select * from a WHERE 
amount=(select MAX(amount) from a where 
date<date_add(date,interval 3 day) and 
date>date_sub(date,interval 3 day)); 

및 날짜 간격으로 최대 값을 찾기 위해

SELECT a1.* 
    FROM a AS a1 
    JOIN a AS a2 ON 
(select * from a1 where 
a2.DATE < a1.DATE + 3 and 
a2.DATE > a1.DATE - 3) myalias 
    WHERE a1.amount > a2.amount; 
+0

최대 값은 +/- 3 달력 일 (쿼리 시도에 의해 표시됨) 간격으로 계산되거나 테이블에서 +/- 3 연속 날짜 간격으로 계산됩니다 (2012-09 원하는 결과에서 -19)? –

+0

나는 테이블에서 연속적인 날짜를 기반으로 계산하려고했는데, 지금은 그렇게하지 않았다. –

답변

0

을, 당신은 다른의 기록을 중심 날짜에 대한 기록을 가입해야 간격으로 날짜를 지정한 다음 센터 날짜별로 그룹화합니다.

SELECT a1.date, a1.amount, max(a2.amount) AS highest 
FROM tbl a1 LEFT JOIN tbl a2 
ON a2.date BETWEEN date_sub(a1.date, interval 3 DAY) 
      AND date_add(a1.date, interval 3 DAY) 
GROUP BY a1.date, a1.amount 
HAVING a1.amount = highest 
ORDER BY a1.date; 

대신 일의 연속 기록에 따라 답을 얻으려면, 당신은 행 번호와 테이블을 augument해야합니다 (자기를 수행하여 자체에 테이블의 조인) :

이 쿼리 다음 자기 일을하면 양 비교할 때 각 날짜의 +/- 3 행에서 행을 선택 자체에이 확장 된 테이블의 조인

SELECT t3.date FROM 
    (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum 
    FROM tbl t1 
    INNER JOIN tbl t2 
    ON t2.date <= t1.date 
    GROUP BY t1.date, t1.amount) AS t3 
LEFT JOIN 
    (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum 
    FROM tbl t1 
    INNER JOIN tbl t2 
    ON t2.date <= t1.date 
    GROUP BY t1.date, t1.amount) AS t4 
ON t3.rownum <> t4.rownum 
AND t3.rownum - t4.rownum BETWEEN -3 AND 3 
AND t4.amount >= t3.amount 
WHERE t4.date IS NULL 
ORDER BY t3.date 

이 MySQL과 PostgreSQL을 모두 작동을, 및 기타에 작동합니다 데이터베이스 엔진도 포함됩니다. MySQL이 아닌 다른 데이터베이스에서는 두 하위 쿼리에 대한 CTE를 사용하여 단순화 할 수 있습니다.

이 을 테스트하십시오.

+0

굉장! 달력 일 동안 완벽하게 작동합니다. 위에서 언급 한대로 테이블에서 연속 날짜를 조정하고 조정해야합니다. 감사! –

+0

나는 해명을 요구했다, 그리고 나는 대답을 잘못 읽었다. –

+0

다시 한번 감사드립니다. 당신이 말했듯이 나는 MySQL을 사용하고 있으므로 다른 방법을 찾아야 할 것입니다. 오류 1235 (42000) :이 버전의 MySQL은 'LIMIT & IN/ALL/ANY/SOME 하위 쿼리'를 지원하지 않습니다. –