Как добавить строки даты для запроса сообщений?

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