2012-01-30 6 views
3

에서 집계 데이터를 제한 나는 이런 식으로 뭔가 보이는 테이블이 : 내가보기를 만들려고 해요MySQL의 - 중첩 된 서브 쿼리에 대한 대안 상관 하위 쿼리

DataTable 
+------------+------------+------------+ 
| Date  | DailyData1 | DailyData2 | 
+------------+------------+------------+ 
| 2012-01-23 |  146.30 |  212.45 | 
| 2012-01-20 |  554.62 |  539.11 | 
| 2012-01-19 |  710.69 |  536.35 | 
+------------+------------+------------+ 

(AggregateView를 호출)의 뜻을, 각 날짜 및 각 데이터 열에 대해 몇 가지 다른 집계를 보여줍니다. 예를 들어, select * from AggregateView where Date = '2012-01-23'주고 있습니다

Data1_MTDAvgavg(DailyData1) 이전 년 1 월 23 일 및 Data1_20DayAvg 월의 각 날짜에 대해 동일한하지만 테이블의 이전 20 날짜를 표시
+------------+--------------+----------------+--------------+----------------+ 
| Date  | Data1_MTDAvg | Data1_20DayAvg | Data2_MTDAvg | Data2_20DayAvg | 
+------------+--------------+----------------+--------------+----------------+ 
| 2012-01-23 |  697.71 |   566.34 |  601.37 |   192.13 | 
+------------+--------------+----------------+--------------+----------------+ 

. 나는 SQL 닌자는 아니지만이 작업을 수행하는 가장 좋은 방법은 하위 쿼리를 사용하는 것이라고 생각했습니다.

select t1.Date, (select avg(t2.DailyData1) 
       from DataTable t2 
       where t2.Date <= t1.Date 
        and month(t2.Date) = month(t1.Date) 
        and year(t2.Date) = year(t1.Date)) Data1_MTDAvg 
from DataTable t1; 

하지만 때문에 결과의 수를 반환 제한 할 필요성을 20 일 평균 끊었지고있어 다음 MTD 평균은 간단합니다. 표의 날짜가 불규칙하므로 날짜 간격을 사용할 수 없습니다. 지난 20 일 동안의 모든 기록이 아니라 테이블에 마지막 20 개의 기록이 필요합니다. 내가 찾은 유일한 해결책은 중첩 된 하위 쿼리를 사용하여 먼저 선택한 레코드를 제한 한 다음 평균을 취하는 것입니다. 혼자

는 하위 쿼리는 각각의 하드 코딩 된 날짜에 대해 작동합니다

select avg(t2.DailyData1) Data1_20DayAvg 
from (select DailyData1 
     from DataTable 
     where Date <= '2012-01-23' 
     order by Date desc 
     limit 0,20) t2; 

그러나 더 큰 쿼리의 일부로이 포함하려고이 불면 :

select t1.Date, (select avg(t2.DailyData1) Data1_20DayAvg 
       from (select DailyData1 
         from DataTable 
         where Date <= t1.Date 
         order by Date desc 
         limit 0,20) t2) 
from DataTable t1; 
ERROR 1054 (42S22): Unknown column 't1.Date' in 'where clause' 

주변 검색에서 내가 인상을 그 from 절의 일부로 상관 된 하위 쿼리를 사용할 수 없습니다. 문제는 여기에 있습니다. 다른 문제는 MySQL이 하위 쿼리에 from 절을 포함하는 뷰 정의를 허용하는지 잘 모르겠다는 것입니다. 이 두 가지 문제를 해결하기 위해 하위 쿼리를 사용하지 않고 집계 선택에서 데이터를 제한하는 방법이 있습니까?

답변

1

아니요, FROM 절에 대응하는 하위 쿼리를 사용할 수 없습니다. 하지만 당신은 ON 조건에서 사용할 수 있습니다

유사
SELECT AVG(d.DailyData1) Data1_20DayAvg 
     --- other aggregate stuff on d (Datatable) 
FROM 
     (SELECT '2012-01-23' AS DateChecked 
    ) AS dd 
    JOIN 
     DataTable AS d 
    ON 
     d.Date <= dd.DateChecked 
    AND 
     d.Date >= COALESCE( 
     (SELECT DailyData1 
     FROM DataTable AS last20 
     WHERE Date <= dd.DateChecked 
      AND (other conditions for last20) 
     ORDER BY Date DESC 
     LIMIT 1 OFFSET 19 
    ), '1001-01-01' ) 
WHERE (other conditions for d Datatable) 

, 많은 날짜에 대해 :

SELECT dd.DateChecked 
    , AVG(d.DailyData1) Data1_20DayAvg 
     --- other aggregate stuff on d (Datatable) 
FROM 
     (SELECT DISTINCT Date AS DateChecked 
     FROM DataTable 
    ) AS dd 
    JOIN 
     DataTable AS d 
    ON 
     d.Date <= dd.DateChecked 
    AND 
     d.Date >= COALESCE( 
     (SELECT DailyData1 
     FROM DataTable AS last20 
     WHERE Date <= dd.DateChecked 
      AND (other conditions for last20) 
     ORDER BY Date DESC 
     LIMIT 1 OFFSET 19 
    ), '1001-01-01' ) 
WHERE (other conditions for d Datatable) 
GROUP BY 
     dd.DateChecked 

두 쿼리 Datatable.DateUNIQUE 제약 조건이 있다고 가정합니다.