Хобрук: Ваш путь к мастерству в программировании

Как получить другие столбцы, не находящиеся в предложении GROUP BY в оракуле select sql?

У меня есть таблица MOVIE, содержащая эти данные.

MOVIE_ID  MOVIE_TITLE              CATEGORY        SALES_AMT
--------- ------------------------ --------------- ----------
M_0000004 The Boss Baby            Animation       2000
M_0000006 Star Wars: The Last Jedi Science Fiction 3000
M_0000007 Get Out                  Horror          4000
M_0000008 Million Dollar Arm       Action          2000
M_0000009 The Conjuring            Horror          1000
M_0000012 The Dark Knight          Action          3000

Мне нужны данные о лучших фильмах на основе SALES_AMT по отношению к CATEGORY

Требуемый результат таков:

MOVIE_ID  MOVIE_TITLE              CATEGORY        SALES_AMT
--------- ------------------------ --------------- ----------
M_0000004 The Boss Baby            Animation       2000
M_0000006 Star Wars: The Last Jedi Science Fiction 3000
M_0000007 Get Out                  Horror          4000
M_0000012 The Dark Knight          Action          3000

Если я использую параметр GROUP_BY, я не могу выбрать MOVIE_ID и MOVIE_TITLE

select CATEGORY, MAX(SALES_AMT)
from MOVIE
group by CATEGORY
;

Ответы:


1

Попробуйте с аналитическими функциями и подзапросом

select movie_id, movie_title, category, sales_amt 
from (
  select movie_id, movie_title, category, sales_amt, 
  row_number() over (partition by category order by sales_amt desc) r 
  from movie
) where r = 1
27.10.2017
  • вам не хватает предложения ORDER в вашем PARTITION BY, чтобы получить самые высокие продажи сверху. И даже при этом я не уверен, что это будет то, что он хочет, потому что, если есть равенство между топами продаж для одной и той же категории, он получит только один случайным образом. 27.10.2017
  • @ThomasG Спасибо, у меня возникла ошибка при публикации ответа, и он съел часть запроса. 27.10.2017
  • @Kacper Вам также нужно предложение from во внутреннем запросе. 27.10.2017
  • Это тоже съели 27.10.2017

  • 2

    Вы можете использовать RANK() для достижения этого:

    SELECT
        MOVIE_ID
        , MOVIE_TITLE
        , CATEGORY
        , SALES_AMT
    FROM
        (
            SELECT
                MOVIE_ID
                , MOVIE_TITLE
                , CATEGORY
                , SALES_AMT
                , RANK() OVER (PARTITION BY CATEGORY ORDER BY SALES_AMT DESC) RNK
            FROM MOVIE
        ) Q
    WHERE RNK = 1
    

    Это было бы, если бы вы хотели видеть дубликаты в своих результатах (где суммы продаж были равны), в противном случае замените RANK на ROW_NUMBER.

    27.10.2017

    3

    Допустим, вы запускаете это первым:

    SQL> select deptno, min(sal)
      2  from emp
      3  group by deptno;
    

    а затем хотите получить сотрудника, который имеет эту минимальную зарплату. Тогда это, конечно, терпит неудачу:

    SQL> select deptno, empno, min(sal)
      2  from emp
      3  group by deptno;
    
    ORA-00979: not a GROUP BY expression
    

    Но вы можете использовать синтаксис KEEP с оконной функцией, чтобы помочь

    SQL> select deptno, min(sal), min(empno) 
      2    KEEP ( dense_rank FIRST order by sal) empno
      3  from emp
      4  group by deptno
      5  /
    
        DEPTNO   MIN(SAL)      EMPNO
    ---------- ---------- ----------
            10       1300       7934
            20        800       7369
            30        950       7900
    

    где это читается как "EMPNO 7934 - это человек, у которого зарплата 1300"

    29.10.2017
    Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..