에서 집계 데이터를 제한 나는 이런 식으로 뭔가 보이는 테이블이 : 내가보기를 만들려고 해요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_MTDAvg
쇼
avg(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
절을 포함하는 뷰 정의를 허용하는지 잘 모르겠다는 것입니다. 이 두 가지 문제를 해결하기 위해 하위 쿼리를 사용하지 않고 집계 선택에서 데이터를 제한하는 방법이 있습니까?