您好我有一個SQL問題:SQL不同領域結合無視位置
表:飛行
Origin Destination
--------------------
Boston LA
LA Bostion
Newyork LA
DC Newyork
我怎麼會選擇拼路徑的不同組合,如果我不在乎始發地或目的地:(波士頓到洛杉磯)=(洛杉磯到波士頓)
您好我有一個SQL問題:SQL不同領域結合無視位置
表:飛行
Origin Destination
--------------------
Boston LA
LA Bostion
Newyork LA
DC Newyork
我怎麼會選擇拼路徑的不同組合,如果我不在乎始發地或目的地:(波士頓到洛杉磯)=(洛杉磯到波士頓)
您可以使用row_number
來做到這一點。獲取分區的起源和目的地最少,起源和目的地最大,以便像(a,b),(b,a)這樣的組合得到相同處理。然後獲得每組的第一行。
select origin,destination from (
select origin,destination
,row_number() over(partition by
case when origin<destination then origin else destination end,
case when origin>destination then origin else destination end
order by origin) as rnum
from flight
) t
where rnum=1
這是做你想做的嗎?
select origin, destination
from flights f
where origin < destination
union all
select destination, origin
from flights f
where origin > destination and
not exists (select 1
from flights f2
where f2.destination = f.origin and f2.origin = f.destination
);
請嘗試以下...
SELECT CASE
WHEN Origin < Destination THEN
Origin
ELSE
Destination
END AS Terminus1,
CASE
WHEN Origin < Destination THEN
Destination
ELSE
Origin
END AS Terminus2
FROM Flight
GROUP BY Terminus1,
Terminus2
ORDER BY Terminus1,
Terminus2;
的CASE
的用於每個記錄水平進行排序,以便在每個記錄的兩個值‘較小’將首先返回。
GROUP BY
將消除水平排序結果中的重複記錄。
ORDER BY
在這種情況下不是必需的,但我認爲這可能會使結果更具可讀性。如果你在一組結果可能在其他地方處理而不是由人讀取,你可能希望拋棄這個條款。
如果您有任何問題或意見,請隨時發佈相應評論。
你正在使用哪個dbms? –
sql server,謝謝 – ADJ