Sto usando SQL Server 2016 e i dati che sto consumando hanno il seguente modulo.
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;
Vorrei ottenere gli ultimi valori non nulli su colonne val1
e val2
raggruppati per cat
e ordinati per t
. Il risultato che sto cercando è
cat val1 val2 A 1 P B 10 C
Il più vicino che ho trovato sta usando LAST_VALUE
ignorando ciò ORDER BY
che non funzionerà poiché ho bisogno dell'ultimo valore non nullo ordinato.
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
La tabella effettiva ha più colonne per cat
( colonne data e stringa) e più colonne val (colonne data, stringa e numero) per selezionare l'ultimo valore non nullo.
Qualche idea su come effettuare questa selezione.
t
valori si ripetono. Non sono dati ben educati.
PARTITION BY cat ORDER BY t, id
per esempio. Altrimenti, la stessa query (qualsiasi query) può fornire risultati diversi su esecuzioni separate. Se le colonne nella tabella sono solo quelle che mostri, non vedo come possiamo avere un determinato ordine!
cat
ordinato dat
.