我的 SQL 具有函数least()
和greatest()
. 返回唯一对的查询:
select least(colA, colB), greatest(cola, colB)
from t
group by least(colA, colB), greatest(cola, colB)
但是,这可能会重新排列非重复行的值。例如,如果一行是 (z, a),那么这里的结果就是 (a, z)。
为了解决这个问题,我们需要找到正确的值。这个想法是计算该对的每个版本出现的次数。如果它出现两次,那么选择哪个似乎是任意的。如果有一次,那么我们需要取出原始行。
这是执行此操作的版本:
select (case when cnt = 1 then colA else l end) as ColA,
(case when cnt = 1 then colB else g end) as ColB
from (select least(colA, colB) as l, greatest(cola, colB) as g,
count(distinct colA) as cnt, min(colA) as colA, min(colB) as colB
from t
group by least(colA, colB), greatest(cola, colB)
) t
这是在做什么?原始查询找到唯一对。在子查询中,它计算该对的每个版本出现在数据中的次数,并将colA
和colB
作为列包含在内。
然后,外部查询为每个已识别的对选择要显示的内容。如果计数是 1——只有一个版本——那么min(colA)
是 ColA,然后min(colB)
是 colB。所以,使用那些。否则,它会任意选择 ColA < ColB 的对。