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 val1e val2agrupados por cate 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 BYque 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.
tvalores se repetem. Não são dados bem comportados.
PARTITION BY cat ORDER BY t, idpor 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!


catordenado port.