Я использую SQL Server 2016, и данные, которые я использую, имеют следующую форму.
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;
Я хотел бы получить последние ненулевые значения по столбцам val1
и val2
сгруппированы по cat
и упорядочены по t
. Результат, который я ищу,
cat val1 val2 A 1 P B 10 C
Самое близкое, что я пришел, - это использование LAST_VALUE
при игнорировании того, ORDER BY
что не будет работать, так как мне нужно упорядоченное последнее ненулевое значение.
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
Фактическая таблица имеет больше столбцов для cat
( столбцы даты и строки) и больше столбцов val (столбцы даты, строки и числа) для выбора последнего ненулевого значения.
Любые идеи, как сделать этот выбор.
t
значения повторяются. Это не очень хорошие данные.
PARTITION BY cat ORDER BY t, id
например. В противном случае один и тот же запрос (любой запрос) может дать разные результаты при отдельных выполнениях. Если столбцы в таблице - это только те, которые вы показываете, я не понимаю, каким образом мы можем иметь определенный порядок!
cat
заказуt
.