#sql #sqlite
#sql #sqlite
Вопрос:
Я получил таблицу сообщений.
id | sender_id | message | date
1 | 1 | Cya | 10/10/2020
2 | 2 | Bye | 10/10/2020
3 | 1 | Heya | 10/11/2020
Я хочу вставить date
строки и type
столбец на основе date
, чтобы это выглядело так.
id | sender_id | message | date | type
1 | null | null | 10/10/2020 | date
1 | 1 | Cya | 10/10/2020 | message
2 | 2 | Bye | 10/10/2020 | message
2 | null | null | 10/11/2020 | date
3 | 1 | Heya | 10/11/2020 | message
3 | null | null | 10/11/2020 | date
При заказе по date, type
первой и последней строками являются даты. И между date
каждыми двумя сообщениями есть строка с разными датами, имеющими значение более поздней даты.
Я понятия не имею, как справиться с этим. Пожалуйста, скажите мне, есть ли у вас какие-либо идеи о том, как подойти к этому.
Комментарии:
1. Пометьте свой вопрос базой данных, которую вы используете.
2. Извините, но ваш вопрос неоднозначен. Откуда вы получаете эти данные в
type
столбце. это из другой таблицы, и вы хотите создатьjoin
между 2 таблицами?? Пожалуйста, приложите некоторые усилия к вашему вопросу, чтобы мы могли понять, чего вы хотите достичь.
Ответ №1:
Это довольно сложно, потому что вы хотите, чтобы новые строки содержали следующую дату, но предыдущий максимальный идентификатор (если он существует), а также 1 строку в конце.
Таким образом, вы можете использовать UNION ALL
для 3 отдельных случаев:
select id, sender_id, message, date, type
from (
select id, sender_id, message, date, 'message' as type, 2 sort
from Messages
union all
select lag(max(id), 1, min(id)) over (order by date), null, null, date, 'date', 1
from Messages
group by date
union all
select * from (
select id, null, null, date, 'date', 3
from Messages
order by date desc, id desc limit 1
)
)
order by date, sort, id
Обратите внимание, что это будет работать, только если ваши даты находятся в сопоставимом формате YYYY-MM-DD
и единственном допустимом формате даты для SQLite.
Посмотрите демонстрацию.
Результаты:
> id | sender_id | message | date | type
> -: | :-------- | :------ | :--------- | :------
> 1 | null | null | 2020-10-10 | date
> 1 | 1 | Cya | 2020-10-10 | message
> 2 | 2 | Bye | 2020-10-10 | message
> 2 | null | null | 2020-10-11 | date
> 3 | 1 | Heya | 2020-10-11 | message
> 3 | null | null | 2020-10-11 | date
Комментарии:
1. Tnx, ключевым решением было объединение сгруппированных и негруппированных версий таблицы. Идентификатор «дата» для меня не важен.
Ответ №2:
Хммм … Я думаю, вы хотите union all
:
select id, sender_id, message, date, 'message' as type
from t
union all
select id, null, null, date, 'date'
from t
order by id;
Редактировать:
На основе вашего комментария:
select id, sender_id, message, date, 'message' as type
from t
union all
select min(id), null, null, date, 'date'
from t
group by date
Комментарии:
1. Это создаст одну
date
строку для каждойmessage
строки, но мне нужна только однаdate
строка для каждого уникальногоdate
2. @IlyaGazman . , , Это не то, что показывает ваш вопрос. Есть три
date
строки, а две имеют повторяющиеся даты.3. Да, может быть, я плохо объясняюсь. Для каждой «даты» существует уникальная дата
type
, ноdate
для типа «сообщение» могут быть дублированные s.