不要将Oracle模数分组

时间:2014-04-01 11:57:41

标签: sql oracle date group-by modulo

当我创建一个包含多个列和一个MOD的select语句时,MOD必须在GROUP BY中,但我不想:)。

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:LOCATION,TEM的最小值和日期。

那么您是否知道如何在GROUP BY中没有MOD的情况下进行此查询?

谢谢

2 个答案:

答案 0 :(得分: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;

希望这有帮助。

答案 1 :(得分:0)

不使用group by,而是使用row_number()来确定TEM的最小值,然后从那里完成查询:

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