Spørgsmål
Du arbejder for et flyselskab, og du har modtaget et datasæt over Pilots rejsetid mellem byer. Du skal bestemme den gensidige og finde de samlede rejsetimer mellem byer. Det betyder, at pilotens rejse fra by '1' til '2' og by '2' til '1' skal betragtes som én, og derefter skal de samlede rejsetimer beregnes.
Skriv en SQL-forespørgsel for at opnå det forventede output.
Svar
Lad os først oprette testdataene.
--create test data
USE demo;
CREATE TABLE dbo.travel_detail (
id int identity(1,1),
from_city varchar(100),
to_city varchar(100),
travel_time_hours smallint
)
GO
INSERT INTO dbo.travel_detail values
('Oslo','Helsinki',125),
('Helsinki','Oslo',110),
('Stockholm','Oslo',132),
('Oslo','Stockholm',180),
('Copenhagen','Helsinki',148),
('Helsinki','Copenhagen',84),
('Stockholm','Copenhagen',116),
('Helsinki','Stockholm',124)
GO
SELECT * FROM dbo.travel_detail
--clean up
--USE demo;
--DROP TABLE dbo.travel_detail
For at opnå det ønskede resultat, bør du bytte bynavnene i rækken baseret på en rækkefølge. Det betyder, at du kan sortere from_city og to_city navnene i en række i stigende eller faldende rækkefølge og derefter beholde den første by som city_1
og den anden som by_2. For at gøre dette kan du bruge mindre end < eller større end > operatør på from_city
og to_city
.
På denne måde vil du være i stand til at aggregere travel_time_hours
ved at gruppere city_1
og city_2
.
--solution
USE demo;
select
city_1,
city_2,
total_travel_hours = sum(travel_time_hours)
from (
select
city_1 = case when from_city < to_city then from_city else to_city end,
city_2 = case when from_city > to_city then from_city else to_city end,
travel_time_hours
from dbo.travel_detail
)x
group by city_1, city_2
order by city_1, city_2
Det er den løsning, jeg har fundet på. Hvis du har opnået output på anden måde, så lad mig det vide i kommentarer.
Tilmeld dig for at modtage disse interviewspørgsmål direkte i din indbakke.