Как разделить и найти самое последнее значение в SQL - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующая таблица:

ID   | col1 | Date Time
1    | WA   | 2/11/20
1    | CI   | 1/11/20
2    | CI   | 2/11/20
2    | WA   | 3/11/20
3    | WA   | 2/10/20
3    | WA   | 1/11/20
3    | WA   | 2/11/20
4    | WA   | 1/10/20
4    | CI   | 2/10/20
4    | SA   | 3/10/20

Я хочу найти все значения идентификаторов, для которых col1 имел некоторое другое значение в дополнение к WA, и самое последнее значение в col1 должно быть 'WA ». то есть из приведенных выше примеров данных должны быть возвращены только значения идентификаторов 1 и 2. Потому что оба из них имеют дополнительное значение (т.е. CI) в дополнение к WA, но все же самое последнее значение для них - WA.

Как мне это получить?

FYI, могут быть некоторые идентификаторы, которые вообще не имеют значения WA. Я хочу устранить их. И те, у которых есть только значение WA, я тоже хочу их исключить.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Вы можете сделать это с агрегацией:

select id
from t
group by id
having min(col1) <> max(col1) and -- at least two different values
       max(case when col1 = 'WA' then datetime end) = max(datetime)   -- last is WA
0 голосов
/ 03 марта 2020

Для этого можно использовать оконные функции:

select distinct id
from (
    select 
        t.*,
        last_value(col1) over(partition by id oder by datetime) last_col1,
        min(col1) over(partition by id) min_col1,
        max(col1) over(partition by id) max_col1
    from mytable t
) t
where last_col1 = 'WA' and min_col1 <> max_col1

Внутренний запрос использует last_value() для восстановления последнего значения col1 для заданного id и вычисляет минимальное и максимальное значения в одном и том же разделе.

Затем внешний запрос фильтрует по id s, последнее значение которого 'WA' и которые имеют как минимум два различных значения (что выражается как неравенство минимального и максимального значения).

...