所以我有這個問題,我有這個表位置{id,name}。在查詢中,我怎樣才能得到兩個不同排列的數量?Oracle安排
比如我有三個位置:
- 葡萄牙
- 西班牙
- 英國
組合是
- 葡萄牙,西班牙
- 西班牙葡萄牙
- 葡萄牙,英國
- 英國,葡萄牙
- 西班牙,英國
- 英國,西班牙
,返回的值應爲6。我不能讓我的頭圍繞此問題。
所以我有這個問題,我有這個表位置{id,name}。在查詢中,我怎樣才能得到兩個不同排列的數量?Oracle安排
比如我有三個位置:
組合是
,返回的值應爲6。我不能讓我的頭圍繞此問題。
這樣做:
SELECT COUNT(1) FROM (SELECT t1.name as name1, t2.name as name2
FROM Locations t1, Locations t2
WHERE t1.name <> t2.name)
最簡單的方法就是運用正確的公式:
select count(*) * (count(*) - 1)
from locations l;
如果你可能有重複,然後用count(distinct)
:
select count(distinct name) * (count(distinct name) - 1)
from locations l;
n件東西的雙向組合數爲n*(n - 1)
。如果配對無論順序如何都相同,您可以將2
除以上。
正如其他人所說,如果你只是想要的數字,這很容易做到,因爲它只是一個數學問題。
如果你真的想要所有的組合,你正在尋找一個笛卡爾產品,除非你想要過濾出相同的對。
見下文 -
with tbl as(
select '01' as id, 'Portugal' as name from dual union all
select '02' as id, 'Spain' as name from dual union all
select '03' as id, 'UK' as name from dual
)
select x.name, y.name
from tbl x, tbl y
where x.name <> y.name
結果:
NAME NAME
Portugal Spain
Portugal UK
Spain Portugal
Spain UK
UK Portugal
UK Spain
聽起來像是簡單的數學,我 - 只是3×2 - 3項有2個自由度。您可以計算多種組合的數量 - 對於4個項目,它應該是4個項目,3個自由度(4 x 3) – Charleh
您確實需要這個數字嗎?這只是一些排列數學運算 - 或者你希望每一對都作爲結果集返回嗎? – Randy