Используя DB2 SQL, как я могу избежать возврата строк, которые не являются самыми последними, для условия, которое НЕ является частью моего предложения where? - PullRequest
0 голосов
/ 18 января 2019

СЦЕНАРИЙНЫЕ ДАННЫЕ:

Row   Col1    Col2    Col3         Col4    Col5
1     Bob     Smith   2000-01-01   John    Doe
2     Bob     Smith   2010-01-01   Jane    Jones
3     Ted     Jones   2005-01-01   Pete    Mills
4     Ted     Jones   2008-01-01   John    Doe

Мой SQL:

select col1, col2 from schema.table where col4='John' and col5='Doe'

Я понятия не имею, как ограничить свои данные в соответствии с потребностями, указанными ниже.

Я ищу, где находится Джон Доу в столбце 4/5, НО я хочу получить строку, только если это текущая связь (на основе столбца 3) для человека в столбцах 1 / 2.

В приведенных выше данных я действительно хочу 4-й ряд, потому что Джон Доу в настоящее время связан с Тедом Джонсом. Но я НЕ хочу получать первую строку ... потому что строка Джона Доу НЕ является текущим отношением для Боба Смита. Нынешнее отношение Боба Смита к Джейн Джонс.

Если бы я искал Пита Миллса, я бы не хотел ничего искать, потому что Пит Миллс - это не текущие отношения с Тедом Джонсом.

1 Ответ

0 голосов
/ 18 января 2019

Вам нужно использовать что-то, что DB2 вызывает OLAP-функции (другие движки RDMS обычно называют их оконными функциями - оба термина действительны). Функция OLAP позволяет вам возвращать аналитические данные о строке, например, какой номер в отсортированном списке.

Для вашего запроса вы хотите вернуть только первую строку для каждого человека, поэтому мы используем функцию OLAP с именем ROW_NUMBER(). Когда мы используем эту функцию, мы хотим разделить данные Col1 / Col2 (т.е. мы группируемся по этим данным), а затем выполнить обратную сортировку по Col3, чтобы получить последний результат. После этого мы хотим выбрать строки с верхним значением в функции OLAP, например:

SELECT *
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY Col3 DESC) AS rn
    FROM schema.table
) AS ranked_scenarios
WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...