Estou procurando limpar dados de eventos que por acaso tenham linhas "duplicadas" para um determinado dia. Quero remover linhas de um dia que tenham mais de um status com base no contexto do status
valor do dia seguinte. Atualmente, estou usando o BigQuery e várias etapas de CTE com self joins para iterar por dias com vários eventos para, eventualmente, "corrigir" todos os dias para ter um único status
valor.
Tentei usar CTEs recursivos com self joins, várias funções de janela, etc. sem muita sorte. O BigQuery não permite funções analíticas em CTEs recursivos, incluindo GROUP BYs :(
Veja abaixo um exemplo de 2 iterações:
# data has multiple instances of days with more than one status (* = duplicate)
| date | status |
|------------|----------|
| 2024-11-01 | active |*
| 2024-11-01 | inactive |*
| 2024-11-02 | inactive |
| 2024-11-03 | active |*
| 2024-11-03 | inactive |*
| 2024-11-04 | active |*
| 2024-11-04 | inactive |*
| 2024-11-05 | active |
# first iteration with removed rows (**)
| date | status |
|------------|----------|
| 2024-11-01 | active |** (2024-11-02 is inactive, so remove this row)
| 2024-11-01 | inactive |*
| 2024-11-02 | inactive |
| 2024-11-03 | active |* (2024-11-04 has duplicates, so we can't derive yet)
| 2024-11-03 | inactive |* (2024-11-04 has duplicates, so we can't derive yet)
| 2024-11-04 | active |*
| 2024-11-04 | inactive |** (2024-11-05 is active, so remove this row)
| 2024-11-05 | active |
# second iteration with removed rows (***)
| date | status |
|------------|----------|
| 2024-11-01 | active |**
| 2024-11-01 | inactive |*
| 2024-11-02 | inactive |
| 2024-11-03 | active |*
| 2024-11-03 | inactive |*** (2024-11-04 has been deduped to active, so remove this row)
| 2024-11-04 | active |*
| 2024-11-04 | inactive |**
| 2024-11-05 | active |
# final desired set of deduplicated rows
| date | status |
|------------|----------|
| 2024-11-01 | inactive |
| 2024-11-02 | inactive |
| 2024-11-03 | active |
| 2024-11-04 | active |
| 2024-11-05 | active |
Posso imaginar ter que iterar N vezes dado o tamanho dos dados. Existe uma abordagem recursiva para esse problema em SQL? Obrigado!
NULL
datas com vários status.FIRST_VALUE
para encontrar o próximo status conhecido para datas comNULL
status.Saída: