Задний план
Пример набора данных
#Employee
Id | Period | Status
---------------------
1 | 1 | L
1 | 2 | G
2 | 3 | L
Я хочу, чтобы простой запрос на выборку выдавал последнюю запись о сотрудниках (по периодам), только если статус = 'L'.
Результаты будут выглядеть следующим образом:
#Desired Results
Id | Period | Status | Sequence
-------------------------------
2 | 3 | L | 1
Наивная попытка
Очевидно, моя наивная попытка запроса не работает:
#select query
SELECT *, RANK() OVER (PARTITION BY id ORDER BY period ASC) sequence
FROM employees
WHERE status = 'L'
AND sequence = 1
Что приводит к следующему:
#Naive (incorrect) Results
ID | Period | Status | Sequence
-------------------------------
1 | 1 | L | 1
2 | 3 | L | 1
Знание порядка, в котором выражения оцениваются в SQL, объясняет, почему это не работает. Вот как оценивается мой запрос:
- Изолировать строки, где status='L'
- Ранжируйте строки
- Изолировать строку верхнего ранга
Я хочу следующее:
- Ранговые строки
- Изолировать строки с верхним рейтингом
- Изолировать, где status='L'
Вопросы
Возможно ли — с помощью простой модификации предложений SELECT/WHERE и использования только основных операторов предикатов — гарантировать, что предикаты, основанные на аналитических функциях в предложении WHERE, будут оцениваться раньше, чем неагрегированные предикаты?
У кого-нибудь есть другие решения, которые могут быть реализованы конечным пользователем в Oracle Discoverer Plus?
Спасибо!
without derived tables, sub-queries, joins, or a GROUP BY clause?
Итак, вы хотите испечь пирог без муки, молока или яиц? - person RichardTheKiwi   schedule 26.03.2011