이전에 질문한 내용입니다.
http://www.gurubee.net/article/65530
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
SELECT length , MIN (dt) dt , MAX (v1) v1 , MAX (v2) v2 , MAX (v3) v3 , MAX (v4) v4 , AVG ( CASE WHEN rn <= 5 THEN v3 END ) avg5_v3 FROM ( SELECT m.length, m.dt , m.v1, m.v2, m.v3, m.v4 , COUNT (*) rn FROM cams_data m , cams_data s WHERE m.vcode = 'TTest7' AND m.wdate = '20150625102214' AND m.vcode = s.vcode AND m.wdate = s.wdate AND m.length = s.length AND m.dt >= s.dt GROUP BY m.length, m.dt , m.v1, m.v2, m.v3, m.v4 ) a GROUP BY length ; |
저번에 답해주신 내용은 잘 적용이 되었는데
저번에는 앞에서 5개씩 끊어서 평균을 냈었는데
이번에는 여기에 추가로 뒤에서 5개씩 끊어서 평균을 내려고 합니다.
SELECT length ,MIN(dt) dt2 , max(DT) dt , MAX(v1) v1 , MAX(v2) v2 , MAX(v3) v3 , MAX(v4) v4 , ROUND(AVG(CASE WHEN rn <= 5 THEN v3 END),2) avg_v3 ,count(rn) ,rn , ROUND(AVG(CASE WHEN rn >= count(rn)-5+1 THEN v3 END),2) avg_v3 FROM ( SELECT m.length, m.dt , m.v1, m.v2, m.v3, m.v4, m.DATA , COUNT(*) rn FROM cams_data m , cams_data s WHERE m.vcode = 'TTest7' AND m.wdate = '20150625102214' AND m.vcode = s.vcode AND m.wdate = s.wdate AND m.length = s.length AND m.dt >= s.dt GROUP BY m.length, m.dt , m.v1, m.v2, m.v3, m.v4 ) sub GROUP BY length ;
와 같이 , ROUND(AVG(CASE WHEN rn >= count(rn)-5+1 THEN v3 END),2) avg_v3를 추가하였는데
이같은 경우는 avg랑 count를 같이써서 에러가 생기는 문제가 있었습니다.
동시에 두개 다 표현하려면
서브쿼리의 조건(m.dt >= s.dt)을 Where 저에서 제거하고
Count 절에서 Case 를 이용해 조건을 주면 됩니다.
SELECT length , MIN(dt) dt , MAX(v1) v1 , MAX(v2) v2 , MAX(v3) v3 , MAX(v4) v4 , AVG(CASE WHEN rn <= 5 THEN v3 END) avg5_v3_asc , AVG(CASE WHEN cnt - rn < 5 THEN v3 END) avg5_v3_desc FROM (SELECT m.length, m.dt , m.v1, m.v2, m.v3, m.v4 , COUNT(CASE WHEN m.dt >= s.dt THEN 1 END) rn , COUNT(*) cnt FROM cams_data m , cams_data s WHERE m.vcode = 'TTest7' AND m.wdate = '20150625' AND m.vcode = s.vcode AND m.wdate = s.wdate AND m.length = s.length -- AND m.dt >= s.dt GROUP BY m.length, m.dt , m.v1, m.v2, m.v3, m.v4 ) a GROUP BY length ;