마농님 그룹에서 일정 개수 뽑기 재질문 0 3 992

by ksbgenius [2015.08.05 15:18:04]


이전에 질문한 내용입니다.

 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를 같이써서 에러가 생기는 문제가 있었습니다.

by 마농 [2015.08.05 17:58:10]
기존 쿼리 그대로 사용하시면서 서브쿼리 조건만 바꾸시면 됩니다.
m.dt <= s.dt

by 마농 [2015.08.06 08:51:58]

동시에 두개 다 표현하려면
서브쿼리의 조건(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
;

 


by ksbgenius [2015.08.06 09:00:56]

감사합니다.!!ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입