mysql 그룹 내에서 일정한 갯수만 뽑기 질문(한가지더 질문) 0 4 979

by ksbgenius [2015.08.04 15:35:12]


캡처.PNG (72,341Bytes)
캡처.PNG (17,087Bytes)
캡처.PNG (12,675Bytes)
캡처.PNG (13,919Bytes)

첫번째 이미지와 같이 data라는 테이블에 자료가 있습니다.


아래와 같이 group by를 이용하여 얻은 결과가 두번째 이미지 입니다.

Select
  min(LENGTH) as len,
  min(DT) as dt,
  max(V1) v1,
  max(V2) v2,
  max(V3) v3,
  max(V4) v4
From cams_data
where cams_data.VCODE = 'TTest7' and WDATE='20150625102214'
group by LENGTH;

세번째 이미지와 같이
data라는 테이블에서 V3의 앞에서 5개 값에 대한 평균값을 avg_v3라는 칼럼으로 해서 넣고 싶습니다.

 

 

Select
  min(LENGTH) as len,
  min(DT) as dt,
  max(V1) v1,
  max(V2) v2,
  max(V3) v3,
  max(V4) v4,
  (select round(SUM(V3)/5, 1)
   from (select V3 from cams_data where cams_data.VCODE = 'TTest7' and WDATE='20150625102214' and LENGTH=2 limit 5) 
   as sub) as avg_v3
From cams_data
where cams_data.VCODE = 'TTest7' and WDATE='20150625102214'
group by LENGTH;

이런 쿼리를 날려보면
네번째 이미지와 같이 avg_v3의 값이 모두 LENGTH=1,2,3,.......일 경우에 해당되는 값으로 모두 채워집니다.


length=0일때 v3 5개의 평균
length=1일때 v3 5개의 평균
length=2일때 v3 5개의 평균........을 avg_v3에 넣고 싶습니다.

 

by 마농 [2015.08.04 16:31:31]

모호한 표현보다는 실질적인 예시자료로 설명해 주시는게 좋겠네요.
어떠어떠한 값을 가져와서 어떤 계산을 거쳐 어떤 결과가 도출되는지?
실질적인 값을 가지고 설명해 주시는게 좋겠네요.

"결과값" 이렇게만 적지 마시고...


LIMIT 을 사용했는데 안된다고요.
말로만 설명하지 마시고
어떻게 사용했는지? 어떤 결과가 나왔는지? 어떤 결과를 원하는지?
구체적으로 설명해 주세요.


Group By 에 없는 항목인 Dt 가 집계함수 없이 그냥 사용되었네요.
MySQL 에서는 에러가 안나지만.. 이렇게 사용하는 것은 안좋은 습관입니다.
MIN(dt) 형태로 사용하시는게 맞습니다.


by ksbgenius [2015.08.04 16:51:15]

수정해서 다시 올려볼께요..


by 마농 [2015.08.04 18:10:57]

Self Join 을 통해 Group By Count 로 순번을 구하고
순번을 Case 조건으로 평균을 구하는 방법입니다.
dt 가 중복값이 없다고 가정하고 시작합니다.
 

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
;

 


by ksbgenius [2015.08.05 09:02:58]

감사합니다.

한가지 더 질문 드려도 될까요.


 SELECT 
      MIN(dt) dt2
     , max(DT) dt
     , MAX(v1) v1
     , MAX(v2) v2
     , MAX(v3) v3
     , MAX(v4) v4
    
     , ROUND(AVG(CASE WHEN rn <= 8 THEN v3 END),2) avg_v3
     ,count(rn)
     , AVG(CASE WHEN rn >= count(rn)-8+1 THEN v3 END) avg_v3_end
  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;

답변해 주신 sql에 제가

10,11번 라인에

count(rn)과 그 밑에 줄에 avg 구하는 것을 더 추가하였습니다.

뭘 하려는 거냐면

 

이전에는 앞에서 5개씩 평균을 내는 거였는데

이번에는 뒤에 것의 5개씩을 평균을 내려고 합니다.

case안에서 count를 쓰려니깐 Invalid use of group function 이러면서 에러가 나더라구요

 

 

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