# #sql #google-bigquery
Вопрос:
У меня есть таблица со следующими полями:
- идентификатор пользователя — идентификатор пользователя
- gate_id — идентификатор ворот, через которые прошел пользователь
- время — время, в течение которого пользователь прошел ворота.
Я хочу получить список ворот, которые прошли пользователи (идентификатор пользователя, идентификатор ворот), упорядоченные по времени. покупайте иногда пользователь проходит через ворота несколько раз один за другим. Я хочу игнорировать эти дела.
например, если у нас есть:
идентификатор пользователя | идентификатор шлюза |
---|---|
1 | 13 |
1 | 13 |
1 | 11 |
1 | 13 |
он проигнорирует только следующие дубликаты и вернет:
идентификатор пользователя | идентификатор шлюза |
---|---|
1 | 13 |
1 | 11 |
1 | 13 |
Как я могу это сделать? Спасибо!
Ответ №1:
Используйте функцию LAG
окна, чтобы найти предыдущую gate_id
строку user_id
, упорядоченную по вашему time
столбцу, а затем отфильтровать нежелательные:
SELECT user_id, gate_id
FROM (
SELECT
user_id,
gate_id,
lag(gate_id) OVER (
PARTITION BY user_id
ORDER BY time
) AS previous_gate_id
FROM t
) t
WHERE previous_gate_id IS NULL OR previous_gate_id <> gate_id