Mantendo uma Linha por Chave
Parte da seção Além do Básico do Journey de SQL da Coddy — lição 26 de 27.
Você frequentemente terá uma tabela onde uma chave (um cliente, um sensor, um produto) aparece várias vezes e você quer manter apenas a mais recente, ou aquela com a maior pontuação.
Use ROW_NUMBER() da mesma forma que você fez para o top-N, então mantenha rn = 1.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY purchased_at DESC
) AS rn
FROM purchases
)
SELECT * FROM ranked WHERE rn = 1O PARTITION BY diz "um ranking por esta chave"; o ORDER BY diz "o mais recente primeiro". A linha 1 em cada partição é a linha que você deseja manter.
Desafio
MédioTabelas e colunas disponíveis:
<strong>readings</strong>:<strong>sensor_id</strong>,<strong>recorded_at</strong>,<strong>value</strong>
Para cada sensor que possua pelo menos 3 leituras, retorne sua única leitura de maior valor. Se duas leituras empatarem no value, mantenha a mais recente.
Exiba sensor_id, recorded_at, value, ordenados por sensor_id.
Folha de consulta
Use ROW_NUMBER() com PARTITION BY para manter apenas a linha mais recente (ou a melhor) por chave e, em seguida, filtre por rn = 1:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY purchased_at DESC
) AS rn
FROM purchases
)
SELECT * FROM ranked WHERE rn = 1PARTITION BY— redefine a classificação para cada chave únicaORDER BY ... DESC— coloca a linha desejada em primeiro lugar (mais recente, mais alta, etc.)WHERE rn = 1— mantém apenas a linha superior por partição
Experimente você mesmo
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY sensor_id ORDER BY value DESC, recorded_at DESC)
-- COUNT(*) OVER (PARTITION BY sensor_id) para filtrar sensores com >= 3 leituras
)
SELECT sensor_id, recorded_at, value
FROM ranked
WHERE rn = 1 AND total_readings >= 3
ORDER BY sensor_id
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Além do Básico
3Agregação Condicional
COUNT com CASESUM com CASETransformando Linhas em ColunasRecapitulação - Fontes de Tráfego6Receitas de Analytics
Top-N por GrupoPercentual do TotalTotal AcumuladoMantendo uma Linha por ChaveRecapitulação - Melhores Clientes