Postgresql Оконная функция для входа в систему и переключения аккаунта - PullRequest
1 голос
/ 09 марта 2020

Предполагая таблицу как DDL ниже. Есть ли способ получить результат запроса SQL ниже через оконную функцию?

Подробнее о выводе: попытка получить время первого входа учетной записи в определенном браузере, пока другой не войдет в систему позже. Другими словами, пытаясь отловить «e12345» при входе в систему в 2020-1-1, затем «e67890» вошел в систему в том же браузере в 2020-1-3. И затем в 2020-1-5 'e12345' снова вошел в браузер '123'. В основном удаление строк 2 и 4 из исходной базы данных.

create table timeline_log_in
    (date text,
    account_id text,
    browser_cookie_id text
    );

insert into timeline_log_in
    values
        ('2020-1-1','e12345','123'),
        ('2020-1-2','e12345','123'),
        ('2020-1-3','e67890','123'),
        ('2020-1-4','e67890','123'),
        ('2020-1-5','e12345','123'),
        ('2020-1-5','e67890','456'),
        ('2020-1-6','e12345','789');

Желаемый вывод:

-----------------------------------------
browser_cookie_id | account_id | date   |
-----------------------------------------
123               |e12345      |2020-1-1|
123               |e67890      |2020-1-3|
123               |e12345      |2020-1-5|
456               |e67890      |2020-1-5|
789               |e12345      |2020-1-6|
-----------------------------------------

1 Ответ

1 голос
/ 09 марта 2020

Вы, кажется, определяете группы на основе account_id и browser_cookie_id. Затем вы хотите только первый ряд. Это говорит о том, что lag():

select tli.*
from (select tli.*,
             lag(date) over (partition by account_id, browser_cookie_id order by date) as prev_group_date,
             lag(date) over (order by date) as prev_date
      from timeline_log_in tli
     ) tli
where prev_group_date is null or prev_group_date <> prev_date;

Здесь - это дБ <> скрипка.

...