Мы получаем неправильное упорядочение результатов при использовании порядка в агрегатной функции в группе по Oracle 12.2. Поэкспериментировав с этим, мы обнаружили, что запрос работает только тогда, когда он сформулирован определенным образом (см. Ниже).
Итак, вот наши вопросы:
1) Почему упорядочение по avg действует привередливее? Действуют ли запросы, как ожидалось, основываясь на некоторой документированной логике / ограничении? Имеет ли это какое-то отношение к базовому типу данных, являющемуся числом (16) без десятичных знаков?
2) Почему использование псевдонима в запросе 4 заставляет его работать, а запрос 3 не работает?
3) Почему запросы работают лучше при заказе по возрастанию? Это не показано ниже, но запрос 2 работает, когда asc, даже если он не работает desc. Запрос 1 не работает с asc.
В приведенных ниже примерах обратите внимание, что продолжительность - это число (16).
Запрос 1: средний порядок функций по функциям
select
name,
avg(duration)
from table1
join table2 on table1.table2_id = table2.id
where duration is not null
group by name
order by avg(duration) desc
-- Query 1 result (wrong)
(some name) 1224417.83471074
(some name) 33568438.1548673
(some name) 3928150.12809406
(some name) 1434939.13464658
(some name) 269338.574638521
Запрос 2: средний порядок функций по псевдониму
-- Query 2: order by avg alias
select
name,
avg(duration) avg
from table1
join table2 on table1.table2_id = table2.id
where duration is not null
group by name
order by avg desc
-- Query 2 result (wrong)
-- See query 1 result
-- Note: For some reason this query works correctly when ordered asc
Запрос 3: средняя функция с порядком приведения по функции
select
name,
to_number(avg(duration))
from table1
join table2 on table1.table2_id = table2.id
where duration is not null
group by name
order by to_number(avg(duration)) desc
-- Query 3 result (wrong)
-- See query 1 result
Запрос 4: функция Avg с порядком приведения по псевдониму
select
name,
to_number(avg(duration)) avg
from table1
join table2 on table1.table2_id = table2.id
where duration is not null
group by name
order by avg desc
-- Query 4 results (correct)
(some name) 562654936
(some name) 498804314
(some name) 263681023
(some name) 245531731
(some name) 188103278
-- the values with decimals show up later in the right order
Запрос 5 и 6: функция Avg с / без приведения с упорядочением во внешнем запросе
select * from (
select
name,
to_number(avg(duration)) avg -- works without to_number as well
from table1
join table2 on table1.table2_id = table2.id
where duration is not null
group by name
) order by avg desc
-- Query 5 & 6 results (correct)
-- See query 4 results