Сортировка даты при использовании группы по, где формат отображения даты определяется пользователем

avatar
SD K
8 августа 2021 в 18:34
46
2
-3

В приведенном ниже запросе

SELECT TO_CHAR(hiredate,'MON-YYYY') Year_of_Hiring, COUNT(empno) No_of_Joinees 
FROM emp
GROUP BY TO_CHAR(hiredate,'MON-YYYY');

Как указать формат в предложении ORDER BY, если я хочу отсортировать результат по дате найма.

Источник
MT0
8 августа 2021 в 19:12
0

@forpas Это будет упорядочено в алфавитно-цифровом порядке по отформатированной строке, а не в хронологическом порядке.

forpas
8 августа 2021 в 19:23
0

@MT0 ты прав. Я прочитал только Как я должен упомянуть формат.. часть вопроса.

mathguy
8 августа 2021 в 19:52
0

Почему группа MON-YYYY с именем Год_of_Hiring в выходных данных? Это не имеет большого смысла, не так ли? Разве это не месяц_найма?

Ответы (2)

avatar
MT0
8 августа 2021 в 19:10
2

Вы можете сгруппировать и упорядочить по TRUNC(hiredate, 'MM'), а затем отформатировать в предложении SELECT:<97023333732513>

SELECT TO_CHAR(TRUNC(hiredate, 'MM'),'MON-YYYY') AS Year_of_Hiring,
       COUNT(empno) No_of_Joinees 
FROM   emp
GROUP BY TRUNC(hiredate, 'MM')
ORDER BY TRUNC(hiredate, 'MM');

mathguy
8 августа 2021 в 19:50
0

Как правило, это намного лучше, чем группировка по строковому представлению (усеченных) дат. Однако следует иметь в виду одну вещь: даже несмотря на то, что Oracle «научился» использовать хэширование для агрегирования (вместо более старой и медленной «сортировки по группам»), если запрос затем также упорядочивает те же столбцы, по которым выполняется агрегирование, он по умолчанию вернется к "группе сортировки по" - что не имеет большого смысла, если входные данные представляют собой миллионы строк, но выходные данные (и, следовательно, ORDER BY) составляют (применяется) всего восемь или шестьдесят строк. Это можно исправить с помощью подсказки use_hash_aggregation.

SD K
9 августа 2021 в 16:46
0

Понял. Спасибо за объяснение.

avatar
Gordon Linoff
8 августа 2021 в 18:35
1

Вы можете использовать функцию агрегирования для упорядочения по исходной дате:

order by min(hiredate)