Пожалуйста, объясните SQL с РАЗДЕЛОМ - PullRequest
0 голосов
/ 07 марта 2012

Может кто-нибудь объяснить, пожалуйста, ниже запрос? Идентификатор не PK, и для одного и того же идентификатора может быть несколько строк. Этот запрос получает последнюю строку.

SELECT ID, SCORE, DATE_OF_SCORE FROM
(
SELECT ID, SCORE, DATE_OF_SCORE, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE_OF_SCORE DESC) RN
FROM PERSON_SCORE_DETAILS
WHERE ID = 123
)
WHERE RN = 1;

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Этот запрос выбирает счет за самое последнее date_of_score для идентификатора 123. Разделение по пунктам здесь является избыточным, поскольку вы выбираете только один идентификатор.

И этот тип запроса лучше обрабатывать с помощью агрегата, например:

select id
     , max(score) keep (dense_rank last order by date_of_score) score
     , max(date_of_score) date_of_score
  from person_score_details
 where id = 123
 group by id

Или даже проще:

select 123
     , max(score) keep (dense_rank last order by date_of_score) score
     , max(date_of_score) date_of_score
  from person_score_details
 where id = 123

С уважением,
Роб.

3 голосов
/ 07 марта 2012

ROW_NUMBER() - аналитическая функция, в этом случае функция, возвращающая отдельное число для каждой строки.Предложение PARTITION управляет окном, в котором генерируется номер строки, а ORDER BY определяет сортировку строк в этом разделе.

Итак, как вы заметили, внутренний запрос производит число для каждой строки, сбрасывая это число для начала каждого прогона записей для данного идентификатора и сортируя их в обратном порядке дат.Это означает, что самая последняя запись для каждого идентификатора имеет номер строки 1. Внешний запрос фильтрует псевдоним этой функции, RN, чтобы создать результирующий набор, содержащий только самые последние записи для всех идентификаторов.

Аналитические функции отличаются от агрегатных функций (т. Е. GROUP BY) тем, что мы можем использовать их без необходимости разбивать все столбцы в проекции.Это делает их полезными в запросах, когда мы хотим вернуть другие столбцы.

Документация Oracle является всеобъемлющей, онлайн и бесплатной.Вы должны научиться ориентироваться в нем. Узнайте больше об аналитических функциях здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...