Выражения CASE с агрегатными функциями MAX Oracle - PullRequest
1 голос
/ 07 декабря 2011

Используя Oracle, я выбрал title_id с соответствующим месяцем публикации:

SELECT title_id, 
CASE EXTRACT(month FROM pubdate) 
    WHEN 1 THEN 'Jan'
    WHEN 2 THEN 'Feb'
    WHEN  3 THEN 'Mar'
    WHEN  4 THEN 'Apr'
    WHEN  5 THEN 'May'
    WHEN  6 THEN 'Jun'
    WHEN  7 THEN 'Jul'
    WHEN  8 THEN 'Aug'
    WHEN  9 THEN 'Sep'
    WHEN  10 THEN 'Oct'
    WHEN  11 THEN 'Nov'
    ELSE 'Dec'
    END MONTH 
FROM TITLES;

Используя выражение:

SELECT MAX(Most_Titles) 
FROM (SELECT count(title_id) Most_Titles, month 
       FROM (SELECT title_id, extract(month FROM pubdate) AS MONTH FROM titles) GROUP BY month);

Я смог определить месяц с помощьюмаксимальное количество опубликованных книг.

Можно ли объединить два утверждения, чтобы я мог связать текстовый эквивалент месяца с максимальным количеством названий?

1 Ответ

3 голосов
/ 07 декабря 2011

Чтобы преобразовать месяц в строку, я бы не использовал оператор CASE, я бы просто использовал TO_CHAR.И вы можете использовать аналитические функции для ранжирования результатов, чтобы получить месяц с большинством опубликованных книг.

SELECT num_titles,
       to_char( publication_month, 'Mon' ) month_str
  FROM (SELECT count(title_id) num_titles,
               trunc(pubdate, 'MM') publication_month,
               rank() over (order by count(title_id) desc) rnk
          FROM titles
         GROUP BY trunc(pubdate, 'MM'))
 WHERE rnk = 1

Несколько дополнительных предостережений

  • Если есть два месяцасвязанный с большинством публикаций, этот запрос вернет обе строки.Если вы хотите, чтобы Oracle произвольно выбрал одну, вы можете использовать аналитическую функцию row_number вместо rank.
  • Если столбец PUBDATE в вашей таблице содержит только полуночные даты первого числа месяцатам, где книга опубликована, вы можете исключить trunc в столбце PUBDATE.
...