Я использую 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 (столбцы даты, строки и числа) для выбора последнего ненулевого значения.
Любые идеи, как сделать этот выбор.
sql-server
window-functions
Эдмунд
источник
источник
cat
заказуt
.t
значения повторяются. Это не очень хорошие данные.PARTITION BY cat ORDER BY t, id
например. В противном случае один и тот же запрос (любой запрос) может дать разные результаты при отдельных выполнениях. Если столбцы в таблице - это только те, которые вы показываете, я не понимаю, каким образом мы можем иметь определенный порядок!Ответы:
Используя технику конкатенации из «Последней ненулевой головоломки » Ицик Бен Ган, вы могли бы выглядеть так с типами данных таблицы и столбца.
Другой способ написать этот запрос, который разделяет шаги на CTE, чтобы, возможно, лучше показать, что происходит. Это дает точно такой же план выполнения, как и запрос выше.
Это решение использует тот факт, что объединение нулевого значения с чем-либо приводит к нулевому значению. SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)
источник
Просто добавьте проверку на NULL в разделе, сделайте
источник
Это должно сделать это. row_number () и объединение
Если у вас нет хорошего сорта, вы должны надеяться, что только один из Q3 не является нулевым.
источник