Estou usando o SQL Server 2016 e os dados que estou consumindo têm o seguinte formato.
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
Gostaria de obter os últimos valores não nulos em colunas val1
e val2
agrupados por cat
e ordenados por t
. O resultado que estou procurando é
cat val1 val2 A 1 P B 10 C
O mais próximo que cheguei é o uso LAST_VALUE
, ignorando o ORDER BY
que não funcionará, pois preciso do último valor não nulo ordenado.
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
cat val1 val2 A NULL NULL B 10 NULL
A tabela real tem mais colunas para cat
( colunas de data e sequência) e mais colunas val (colunas de data, sequência e número) para selecionar o último valor não nulo.
Alguma idéia de como fazer essa seleção.
sql-server
window-functions
Edmund
fonte
fonte
cat
ordenado port
.t
valores se repetem. Não são dados bem comportados.PARTITION BY cat ORDER BY t, id
por exemplo. Caso contrário, a mesma consulta (qualquer consulta) poderá fornecer resultados diferentes em execuções separadas. Se as colunas da tabela são apenas as que você mostra, não vejo como podemos ter uma ordem determinada!Respostas:
O uso da técnica de concatenação de The Last non NULL Puzzle de Itzik Ben Gan ficaria assim com seus tipos de dados de tabela e coluna de amostra.
Outra maneira de escrever essa consulta que divide as etapas em CTEs para talvez mostrar melhor o que está acontecendo. Ele fornece exatamente o mesmo plano de execução que a consulta acima.
Esta solução usa o fato de que concatenar um valor nulo com algo resulta em um valor nulo. SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)
fonte
Basta adicionar uma verificação de NULL na partição fará
fonte
Isso deve servir. row_number () e uma junção
Se você não tem uma boa classificação, espera que apenas um dos Q3 não seja nulo.
fonte