一、数据
2978. 对称坐标
表: Coordinates
+-------------+------+
| Column Name | Type |
+-------------+------+
| X | int |
| Y | int |
+-------------+------+
每一行包括 X 和 Y,都是整数。表格可能包含重复值。
如果两个坐标 (X1, Y1)
和 (X2, Y2)
满足条件 X1 == Y2
和 X2 == Y1
,则它们被称为 对称 坐标。
编写一个解决方案,找出在所有这些对称坐标中,满足条件 X1 <= Y1
的唯一坐标。
按照 X
和 Y
分别 升序 排列结果表。
结果格式如下示例所示。
示例 1:
输入:
Coordinates table:
+----+----+
| X | Y |
+----+----+
| 20 | 20 |
| 20 | 20 |
| 20 | 21 |
| 23 | 22 |
| 22 | 23 |
| 21 | 20 |
+----+----+
输出:
+----+----+
| x | y |
+----+----+
| 20 | 20 |
| 20 | 21 |
| 22 | 23 |
+----+----+
解释:
- (20, 20) 和 (20, 20) 是对称坐标,因为 X1 == Y2 和 X2 == Y1。所以 (20, 20) 被显示为独特的坐标。
- (20, 21) 和 (21, 20) 是对称坐标,因为 X1 == Y2 和 X2 == Y1。然而,只有 (20, 21) 会被显示,因为 X1 <= Y1。
- (23, 22) 和 (22, 23) 是对称坐标,因为 X1 == Y2 和 X2 == Y1。然而,只有 (22, 23) 会被显示,因为 X1 <= Y1。
输出表按照 X 和 Y 升序排列。
二、分析
本题的解法就是将表格进行自关联,然后让第一个坐标的X值等于第二个坐标的Y值,第一个坐标的Y值等于第二个坐标的X值,且每个坐标的X值小于等于Y值,那么这样就十分简单了,直接进行表关联,然后直接写关联条件即可。
但是!!!
题目本身的意义是将本身数据与表中的其他数据进行关联,而直接进行自关联的话会让自己也关联上了自己,如果坐标的X值和Y值都相等,那么就会出现多余数据,所以我们应该香个办法解决这个问题。
那就是先对表中的数据进行排序处理,然后在关联时,并让数据的排名不相等,这样就不会初夏自己关联自己的情况。
三、代码
with t as (select *,row_number() over () id -- 首先对表中的数据进行排名from coordinates
)selectdistinct c1.X,c1.Y
from t c1
join t c2 on c1.X = c2.Y and c1.Y = c2.X and c1.X<=c1.Y and c1.id<>c2.id -- 关联条件再加上一个排名的id不相等
order by c1.X,c1.Y
四、分析
总体来说,本题难度较小,就是需要注意到自己关联自己的情况。