Я використовую 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
.