SQL — Возвращает объединенную строку самого последнего содержимого из совпадающих строк

#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.