SQLite 比较订单

SQLite Compare Orders

假设我有一个包含两列 a1a2 的 table。

我需要检查这个table的顺序是否相同,当我按a1排序时,如果我按a2排序。

Select a1, a2 from Test order by a1

a1 a2
1 2
2 1
3 3

Select a1, a2 from Test order by a2

a1 a2
2 1
1 2
3 3

是否可以根据每个输出的顺序检查两个结果是否实际上相同?

我试过类似的方法:

With order_1 as (Select * from Test order by a1),
     order_2 as (Select * from Test order by a2)

Select * from order_1 except Select * from order_2

这应该产生如下内容:

a1 a2
2 1
1 2

但这行不通,因为它显然不遵守顺序。

我们可以在 CTE 中使用 ROW_NUMBER() OVER ( ORDER BY 来查找当我们使用 2 个不同的键进行排序时不在同一位置的条目。
这里我们把 3 和 4 取反了。

create table sorter (
a1 int, a2 int);
insert into sorter values
(1,100),(2,200),(3,400),(4,300),(5,500);
with cte as (
select 
  a1,
  a2,
  row_number() over (order by a1) rna1,
  row_number() over (order by a2) rna2
from sorter)
select
  a1,
  a2
from cte where rna1 <> rna2;
a1 |  a2
-: | --:
 3 | 400
 4 | 300

db<>fiddle here

对cte中的每个列a1a2使用ROW_NUMBER() window函数两次,然后对cte进行自连接以过滤掉匹配行数:

WITH cte AS (
  SELECT *,
         ROW_NUMBER() OVER (ORDER BY a1) rn_a1,
         ROW_NUMBER() OVER (ORDER BY a2) rn_a2
  FROM Test 
)
SELECT c1.a1, c1.a2
FROM cte c1 INNER JOIN cte c2
ON c1.rn_a1 = c2.rn_a2 AND (c1.a1, c1.a2) <> (c2.a1, c2.a2) 
ORDER BY c1.a1;

参见demo

结果:

a1 a2
1 2
2 1