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.
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!
cat
ordenado port
.