#sql #mariadb
#sql #mariadb
Вопрос:
Я не могу понять это — я думаю, это просто, но я не могу найти подходящий метод.
Я полагаю, что это называется «Последняя ненулевая головоломка», но я не могу следить за решениями в Интернете! На данный момент я использую PHP для анализа возвращаемого массива до тех пор, пока все переменные не будут заполнены, но я бы предпочел сделать это в SQL. Использование MariaDB 8 в Ubuntu.
Идентификатор увеличивается по мере добавления записей. Это может быть дата-время.
Если у меня есть следующее:
ID | Data1 | Data2 | Data3
1 | NULL | Book | NULL
2 | Pink | NULL | Cat
3 | NULL | Book | NULL
4 | Blue | NULL | NULL
5 | NULL | Stool | Cat
6 | White | NULL | NULL
7 | NULL | NULL | Bull
Как бы я вернул: White | Stool | Bull
(самые «последние» не-нули)?
Есть ли способ выбрать on id = '4'
и return Blue | Book | Cat
?
Я пытался часами! Я видел несколько сообщений об объединении, но они, похоже, не применяются. Извините, это тривиально — я предполагаю, что это так, но я не могу понять.
Комментарии:
1. Пожалуйста, укажите тип базы данных. Также не понимаю основную логику, которую вы запрашиваете. Что такое «самое последнее»? Дата отсутствует. Вам нужно предоставить больше объяснений.
2. Обновлено. Спасибо
3. MariaDB 8 отсутствует. Что
select version()
говорит;4. 8.0.22-0ubuntu0.20.04.3
Ответ №1:
пожалуйста, проверьте следующий код.
SELECT * FROM
(SELECT Data1 FROM test t2
WHERE Data1 IS NOT NULL
ORDER BY ID DESC LIMIT 1
) Data1,
(SELECT Data2 FROM test t2
WHERE Data2 IS NOT NULL
ORDER BY ID DESC LIMIT 1
) Data2,
(SELECT Data3 FROM test t3
WHERE Data3 IS NOT NULL
ORDER BY ID DESC LIMIT 1
) Data3
Комментарии:
1. Вам лучше поместить подзапросы непосредственно в
SELECT
, на всякий случай, если некоторые столбцы имеют толькоNULL
значения.
Ответ №2:
Вы можете получить эффективные значения для каждой строки, используя оконные функции:
select t.*,
max(data1) over (partition by grp1) as imputed_data1,
max(data2) over (partition by grp2) as imputed_data2,
max(data3) over (partition by grp3) as imputed_data3
from (select t.*,
count(data1) over (order by id) as grp1,
count(data2) over (order by id) as grp2,
count(data3) over (order by id) as grp3
from t
) t;
Затем вы можете просмотреть значения для всех id
или некоторых id
s или последней строки, используя это как подзапрос или CTE.