SQLite 比较订单
SQLite Compare Orders
假设我有一个包含两列 a1
和 a2
的 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中的每个列a1
和a2
使用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
假设我有一个包含两列 a1
和 a2
的 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中的每个列a1
和a2
使用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 |