Следующие данные относятся к человеку, отправляющему 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');
То, чего я пытаюсь достичь, это
Я пытаюсь. Мне могут понадобиться некоторые идеи о том, как этого добиться. Я совершенно смущен, чтобы использовать Case или JOIN.
Предоставленная вами таблица создания и вставки данных даже не запускается - возможно, проверьте это перед публикацией
один вопрос, seq всегда начинается с 1?
Вы определили свою таблицу Send
и Arrive
как date
, но примеры данных показывают, что это дата и время. Также дата недействительна 2022-25-23
@RajatJha Да, всегда начинайте с 1
И нет такой даты как 2022-25-23
То, что вам нужно, это просто SELF JOIN
@Squirrel Я только что обновился. SQL был неправильным. Извини за это
Все еще сломанный NCHAR(10)
не подходит Saudi Arabia
и зачем вообще использовать nchar
?
Одно из решений, если у вас не так много данных.
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;
Что возвращает:
Примечание. Данные вашего образца были повреждены:
Правильное выполнение такого рода вещей значительно облегчит настоящую работу.
Вот пример использования функции 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
На самом деле это замечательный подход. Отличная работа.
Вы пробовали что-нибудь?