2014-04-01 3 views
0

여러 컬럼과 MOD로 select 문을 만들 때 MOD는 GROUP BY에 있어야하지만 나는 원하지 않습니다 :).오라클 modulo를 그룹화하지 말것

SELECT LOCATION, ROUND(MIN(TEM)) TN, MOD((to_number(TO_CHAR(DATE, 'hh24'))+RANGE), 24) 
FROM TABLE 
WHERE TRUNC(DATE) = TRUNC(SYSDATE) 
AND RANGE BETWEEN 18 AND 30 
GROUP BY LOCATION, MOD((to_number(TO_CHAR(DATE, 'hh24'))+RANGE), 24) 
ORDER BY LOCATION 

LOCATION별로 TEM의 최소 값과 날짜를 원합니다.

그래서 GROUP BY에서 MOD없이이 쿼리를 수행하는 방법에 대한 아이디어가 있습니까?

감사합니다.

답변

0

분석 기능을 사용하십시오.

SELECT DISTINCT LOCATION, TN, my_mod 
FROM 
(
SELECT LOCATION, MIN(TEM)) OVER (PARTITION BY LOCATION) TN, MOD((to_number(TO_CHAR(DATE, 'hh24'))+RANGE), 24) my_mod 
FROM TABLE 
WHERE TRUNC(DATE) = TRUNC(SYSDATE) 
AND RANGE BETWEEN 18 AND 30 
) 
order by location; 

희망이 있습니다.

0

대신 group by를 사용하는 TEM의 최소값을 식별 할 수 row_number()를 사용하고 거기에서 쿼리 완료 :

SELECT LOCATION, ROUND(TEM) TN, MOD((to_number(TO_CHAR(DATE, 'hh24'))+RANGE), 24) 
FROM (SELECT t.*, row_number over (partition by location order by tem) as seqnum 
     FROM TABLE t 
     WHERE TRUNC(DATE) = TRUNC(SYSDATE) AND RANGE BETWEEN 18 AND 30 
    ) t 
WHERE seqnum = 1 
ORDER BY LOCATION 
관련 문제