Вы можете сделать это с window functions. Я Разделенный результат в 2-х частей, а затем использовал этот раздел для row_number
window function
- , имеющих нулевых значений
- иметь действительный действительный
Затем, используя основной case
, чтобы получить те, имеющие row_number
, как 1
и которые имеют значение в них not null
SQLFIDDLE
SELECT
max (CASE
WHEN a_row_num = 1 AND a IS NOT NULL THEN a
END) AS A,
max (CASE
WHEN b_row_num = 1 AND B IS NOT NULL THEN B
END) AS B,
max (CASE
WHEN c_row_num = 1 AND C IS NOT NULL THEN C
END) AS C
FROM
(
SELECT
a,
row_number () over (partition BY a IS NULL ORDER BY ID) a_row_num,
b,
row_number () over (partition BY b IS NULL ORDER BY ID) b_row_num,
c,
row_number () over (partition BY c IS NULL ORDER BY ID) c_row_num
FROM
test
) AS sub_query
Выход:
| A | B | C |
|---|---|---|
| 1 | 9 | 7 |
Примечание: Я добавил id
поле, которое помогает узнать, какие из записей первым был введен, мы используем его в порядке возрастания в нашей оконной функции
«первый» imples заказ к столу, есть столбец на заказ на? –
@ PetterEngström Да, должен быть * заказ *, может быть что угодно. В моем случае это поле метки времени. –
@AlexB Колонка, которую вы заказываете, должна быть частью вашей таблицы примеров. SQL-запросы не дают результатов в каком-либо конкретном порядке, если SQL-запрос не запрашивает порядок явно. – Oswald