Я пытаюсь измерить чистое изменение с первой записи опроса по сравнению с последней записью того же вопроса в том же опросе, поскольку более поздние опросы, как правило, являются неполными и, следовательно, имеют нулевые значения.
Ответы на опросдля одного и того же участника:
┌─────────────────────────────────────┐
| p_id | rank | val_a | val_b | val_c |
| 2 | 1 | 1 | 2 | 3 |
| 2 | 2 | 2 | | |
| 2 | 3 | 4 | 4 | 1 |
| 2 | 4 | 4 | 3 | |
└─────────────────────────────────────┘
Desired output:
┌──────────────────────────────┐
| p_id | val_a | val_b | val_c |
| 2 | 3 | 1 | -2 |
└──────────────────────────────┘
a = row4 - row1
b = row4 - row1
c = row3 - row1 (uses the rank3 value since rank4 has none)
Результат должен показать разницу между значением столбца строки с наивысшим рейтингом, который не является нулевым, и значением того же столбца в первой строке, который долженникогда не будет нулевым.
Пока у меня есть код для разницы между двумя строками, но я не могу понять, как учитывать нулевые значения, когда в более низком ранге есть ненулевое значение, которое можно использовать,
SELECT
p_id,
CASE WHEN ("p_val_a" IS NOT null) AND (rank != 1) AND ("val_a" IS NOT null) THEN "val_a" - "p_val_a" ELSE NULL END as "diff_val_a",
CASE WHEN ("p_val_b" IS NOT null) AND (rank != 1) AND ("val_b" IS NOT null) THEN "val_b" - "p_val_b" ELSE NULL END AS "diff_val_b",
CASE WHEN ("p_val_c" IS NOT null) AND (rank != 1) AND ("val_c" IS NOT null) THEN "val_c" - "p_val_c" ELSE NULL END AS "diff_val_c"
FROM
(
SELECT
p_id,
"val_a",
"val_b",
"val_c",
LAG("val_a") OVER w AS "p_val_a",
LAG("val_b") OVER w as "p_val_b",
LAG("val_c") OVER w as "p_val_c"
FROM
dataset WINDOW w AS (
PARTITION BY
p_id
ORDER BY
rank
)
) t;
В приведенном выше примере, если я запрашиваю только первую и последнюю строки, val_a и val_b дают правильные результаты.Но val_c выдаст null вместо -2, как я хочу.
Как сравнить значения первой строки со значением того же столбца в строке с последним ненулевым значением?