Построение времени отправки и получения из нескольких строк

Следующие данные относятся к человеку, отправляющему IpHone 14 pro max своей жене. Айфон 14 про макс должен путешествовать из Америки в Китай, из Китая в Аргентину и, наконец, из Аргентины в Саудовскую Аравию, так как девушка находится в Саудовской Аравии. смотрю ФИФА.

CREATE TABLE IPhone (Id int, Country NVARCHAR(12), seqNo int, Send datetime2(0), Arrive datetime2(0));

INSERT INTO IPhone VALUES 
('1001','America','1', '2022-11-23 18:30:00.000',null),
('1002','China','2', '2022-11-24 08:18:00.000','2022-11-24 05:00:00'),
('1003','Argentina','3', '2022-11-25 18:30:00.000','2022-11-24 18:18:00.000'),
('1004','Saudi Arabia','4',null,'2022-11-25 20:30:00.000');

То, чего я пытаюсь достичь, это

  1. Отправлено из Америки 2022-11-23 18:30:00.000 и доставлено в Китай по адресу 2022-11-24 05:00:00
  2. Отправлено из Китая 24.11.2022 08:18:00.000 и
    достигнуто в Аргентине 2022-11-24 18:18:00.000
  3. Отправлено из Аргентины 25-11-2022 18:30:00.000 и достигнуто в Саудовской Аравии 25-11-2022 20:30:00.000

Вы пробовали что-нибудь?

Dale K 23.11.2022 10:04

Я пытаюсь. Мне могут понадобиться некоторые идеи о том, как этого добиться. Я совершенно смущен, чтобы использовать Case или JOIN.

Bhoklu Singh 23.11.2022 10:07

Предоставленная вами таблица создания и вставки данных даже не запускается - возможно, проверьте это перед публикацией

Dale K 23.11.2022 10:16

один вопрос, seq всегда начинается с 1?

Rajat Jha 23.11.2022 10:18

Вы определили свою таблицу Send и Arrive как date, но примеры данных показывают, что это дата и время. Также дата недействительна 2022-25-23

Squirrel 23.11.2022 10:18

@RajatJha Да, всегда начинайте с 1

Bhoklu Singh 23.11.2022 10:18

И нет такой даты как 2022-25-23

Dale K 23.11.2022 10:20

То, что вам нужно, это просто SELF JOIN

Squirrel 23.11.2022 10:22

@Squirrel Я только что обновился. SQL был неправильным. Извини за это

Bhoklu Singh 23.11.2022 10:23

Все еще сломанный NCHAR(10) не подходит Saudi Arabia и зачем вообще использовать nchar?

Dale K 23.11.2022 10:29
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
10
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Одно из решений, если у вас не так много данных.

FiddleDemo

select
Id, Country countryFrom, 
    (select top 1 Country from IPhone c where c.seqNo > IPhone.seqNo ) CountryTo, 
    Send_date,
    (select top 1 Arrive_date from IPhone c where c.seqNo > IPhone.seqNo ) Arrive

from IPhone 

Другой способ - связать через seq_no

select 
    IPhone.Id,
    IPhone.Country,
    c.country,
    IPhone.Send_date,
    c.Arrive_date
from IPhone
left join IPhone c on IPhone.seqNo + 1 = c.seqNo

Обновлено: как Дейл упомянул вас, ваш сценарий создания таблицы не в порядке, поэтому я сохранил значения как значения nvarchar.

Ответ принят как подходящий

Вы ищете самостоятельное присоединение к следующей строке, как показано ниже. Однако я не уверен, что желаемые результаты, которые вы показываете, верны, потому что вы используете значение прибытия следующего пункта назначения, что кажется странным.

CREATE TABLE IPhone (Id int, Country NVARCHAR(12), seqNo int, Send datetime2(0), Arrive datetime2(0));

INSERT INTO IPhone VALUES 
('1001','America','1', '2022-11-23 18:30:00.000',null),
('1002','China','2', '2022-11-24 08:18:00.000','2022-11-24 05:00:00'),
('1003','Argentina','3', '2022-11-25 18:30:00.000','2022-11-24 18:18:00.000'),
('1004','Saudi Arabia','4',null,'2022-11-25 20:30:00.000');

SELECT f.id, f.Country CountryFrom, t.Country CountryTo
    , convert(varchar(4),f.seqNo) + '-' + convert(varchar(4),t.seqNo) seqNo
    , f.Send, t.Arrive
FROM IPhone f
INNER JOIN IPhone t ON t.seqNo = f.seqNo + 1
ORDER BY id;

Что возвращает:

я бы СтранаОт СтранаКому номер последовательности послать Прибыть 1001 Америка Китай 1-2 2022-11-23 18:30:00 2022-11-24 05:00:00 1002 Китай Аргентина 2-3 2022-11-24 08:18:00 2022-11-24 18:18:00 1003 Аргентина Саудовская Аравия 3-4 2022-11-25 18:30:00 2022-11-25 20:30:00

DBFiddle

Примечание. Данные вашего образца были повреждены:

  • вы пытались сохранить дату и время в дате
  • у вас были неправильные даты
  • вы хранили числа в строках
  • и ваша строка была слишком короткой для данных.

Правильное выполнение такого рода вещей значительно облегчит настоящую работу.

Вот пример использования функции LEAD,

SELECT id
, Country AS CountryFrom
, LEAD(Country,1) OVER (ORDER BY SeqNo) AS CountryTo
, CAST(seqNo AS VARCHAR(4)) + '-' + CAST(LEAD(seqNo,1) OVER (ORDER BY SeqNo) AS VARCHAR(4)) AS seqNo
, Send
, LEAD (Arrive,1) OVER (ORDER BY SeqNo) AS Arrive
FROM Iphone

На самом деле это замечательный подход. Отличная работа.

Anel Hodžić 23.11.2022 11:41

Другие вопросы по теме