我有下面的数据
dep, arr
uk, usa
usa, uk
china,aus
aus,china
brazil,uk
我如何从上述数据中得到唯一和非唯一的组合
唯一组合(departure to arrival and arrival to departure both are present)
dep, arr
uk, usa
usa, uk
china,aus
aus,china
非唯一组合,其中仅存在departure to arrival or arrival to departure
,反之亦然
brazil,uk
使用此sql查询,但不确定如何针对特定于非唯一
Select
dep, arr, count(*) over (partition by least(dep, arr), greatest(dep, arr) order by dep) rnk
From flights
有什么建议吗?
6条答案
按热度按时间yhqotfr81#
您可以使用
not exists()
来确保出发不可用作到达,到达不可用作出发:查询
输出:
| DEP|ARR|
| --------------|--------------|
| 巴西|英国|
fiddle
iyzzxitl2#
简单子查询怎么样?
样本数据:
这就是你所谓的“独特组合”:
这就是所谓的“非唯一组合”:
分隔符设置为
~
字符,假定它不包含在dep
或arr
列值中。如果是,那么用不存在的东西替换它(可以是 * 任何 * 其他字符)。zc0qhyus3#
您可以使用
greatest/least
作为group by表达式的简单聚合来计算包含排列的2元素元组的出现次数。它为您的示例数据返回
| LOC1|LOC2|类型_|
| --------------|--------------|--------------|
| 美国|英国|双向|
| 中国|奥斯|双向|
| 英国|巴西|单程|
fiddle
将
count(*) = N
放在having
子句中,以仅返回所需的组合类别。omvjsjqw4#
一个连接就可以了
fiddle
7gcisfzg5#
你几乎就在那里了,你想删除解析函数中的
ORDER BY
子句(所以你在整个窗口上计数),然后过滤外部查询:其中,对于样本数据:
输出:
| DEP|ARR|
| --------------|--------------|
| 巴西|英国|
如果您可以在每个方向上有多个航班,则计算每个组合中
DISTINCT
起飞或到达的数量:输出:
| DEP|ARR|
| --------------|--------------|
| 巴西|英国|
以及:
输出:
| DEP|ARR|
| --------------|--------------|
| 奥斯|中国|
| 中国|奥斯|
| 英国|美国|
| 美国|英国|
并且,如果要显示所有行和方向:
输出:
| DEP|ARR|方向|
| --------------|--------------|--------------|
| 奥斯|中国|双向的|
| 中国|奥斯|双向的|
| 巴西|英国|单向的|
| 英国|美国|双向的|
| 美国|英国|双向的|
fiddle
ltqd579y6#
@Littlefoot的回答可能会产生误报和漏报;例如,如果你有
arr
,dep
的a-b
,c
和b-c
,a
,那么当在一个方向上匹配时,字符串连接将给予a-b-c
。fiddle您可以使用
IN
和多个术语执行类似的测试,它不会出现误报,因为它没有使用字符串连接来合并术语。获取双向航班:
对于样本数据,输出:
| DEP|ARR|
| --------------|--------------|
| 美国|英国|
| 英国|美国|
| 奥斯|中国|
| 中国|奥斯|
获取单程航班:
其输出:
| DEP|ARR|
| --------------|--------------|
| 巴西|英国|
如果你想获取所有航班并标记它们,那么使用
CASE
表达式:其输出:
| DEP|ARR|方向|
| --------------|--------------|--------------|
| 英国|美国|双向的|
| 美国|英国|双向的|
| 中国|奥斯|双向的|
| 奥斯|中国|双向的|
| 巴西|英国|单向的|
但是,这种方法需要查询表两次,一次是主查询,一次是
IN
过滤器,因此效率不如使用theCOUNT
analytic function(即使查询看起来稍微复杂一些)。fiddle