Group By 를 쓰면서 일반 컬럼을 출력하려면 어떻게 해야 하나요? 0 6 579

by 알수없음 [DB 기타] PostgreSQL [2019.05.22 09:36:51]


현재 테이블의 컬럼이

[KEY][TEMP][TIME]

이런식으로 있습니다.

 

[TIME] 컬럼은 입력시 '초' 단위까지 들어가기 때문에

간혹 2개 이상의 값이 들어갈때가 있습니다.

 

그래서 같은 시간 단위로 묶고, 그 중 높은 [TEMP] 값과 이에 해당되는 [KEY] 값을 출력하고자 합니다.

KEY TEMP TIME
1 200 2019-05-22 09:00:00
2 190 2019-05-22 09:00:00
3 230 2019-05-22 09:00:01
4 240 2019-05-22 09:00:01

만약 이렇게 있다면

1/200/2019-05-22 09:00:00

4/240/2019-05-22 09:00:01

이렇게 출력하고 싶습니다.

 

현재

SELECT MAX(TMEP) TEMP, TIME

FROM TABLENAME GROUPBY TIME;

이런식으로 했는데 KEY 컬럼을 어떻게해야 원하는대로 출력을 할수있을까요?

물론 GROUP BY 키워드를 꼭 사용하지 않아도 됩니다.

답변 부탁드립니다.

by 캘린다 [2019.05.22 10:16:24]
WITH t AS
(
select '1' key, '200' temp, '2019-05-22 09:00:00' time from dual union all 
select '2' key, '190' temp, '2019-05-22 09:00:00' time from dual union all
select '3' key, '230' temp, '2019-05-22 09:00:01' time from dual union all 
select '4' key, '240' temp, '2019-05-22 09:00:01' time from dual 
)
select 
key, temp, time
from
        (
        select key, temp, time, row_number() over(partition by time order by temp) rk from t
        )
    where time||rk in
                                (
                                select time||max(rk) from ( select key, temp, time, row_number() over(partition by time order by key, temp) rk from t ) group by  time
                                )
order by key

by 열심열심 [2019.05.22 11:12:33]

WITH t AS
(
select '1' key, '200' temp, '2019-05-22 09:00:00' time from dual union all
select '2' key, '190' temp, '2019-05-22 09:00:00' time from dual union all
select '3' key, '230' temp, '2019-05-22 09:00:01' time from dual union all
select '4' key, '240' temp, '2019-05-22 09:00:01' time from dual 
)
select
key, temp, time
from (select key, temp, time, row_number() over(partition by time order by temp desc ) rk from t)
where rk  =1

캘린다님 참조 


by 알수없음 [2019.05.22 13:37:21]

캘린다 // 감사합니다.

열심열심 // 감사합니다. 두분 다 답변채택하고 싶어도 한분만 되네요.


by 알수없음 [2019.05.22 17:55:37]

추가로 여러컬럼 에서 최대값을 뽑으면 어떻게 해야 할까요?

[COL1][COL2][COL3][TIME] 같을때

같은 시간으로 묶고

특정 시점에서

(WHERE 절 'TIME' >= '특정시작시점' AND 'TIME' < '특정종료시점')

그룹핑된 TIME 로우에서

COL1 의 최대값, COL2 의 최대값, COL3 의 최대값 이런식으로요.

 


by 마농 [2019.05.23 16:29:25]
SELECT time
     , MAX(col1) col1
     , MAX(col2) col2
     , MAX(col3) col3
  FROM t
 WHERE time >= :s_time
   AND time <  :e_time
 GROUP BY time
;

 


by 알수없음 [2019.05.24 09:12:37]

마농 // 감사합니다.

이렇게 해놨는데 안되서 쿼리가 문제인줄 알았더니...

데이터 넣는코드가 밀리초까지 되어있고, 쿼리툴이 초 까지만 표시해서...였어요.

 

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