题目
本人的解法一
-- 先用窗口函数给数据加上行号,之后用两个表格连接,多个筛选条件
with t1 as(
select row_number() over(order by X) as rn, X, Y from Functions
)
select distinct t1.X, t1.Y
from t1 join t1 t2
on t1.X=t2.Y and t1.Y=t2.X and t1.rn!=t2.rn
where t1.X<=t1.Y
order by t1.X;
本人的解法二
-- join换成where连接
with t1 as(
select row_number() over(order by X) as rn, X, Y from Functions
)
select distinct t1.X, t1.Y
from t1, t1 t2
where t1.X=t2.Y and t1.Y=t2.X and t1.rn!=t2.rn and t1.X<=t1.Y
order by t1.X;
大神的解法
和自己的差不多,看样子我终于学到一些精髓了
WITH one AS(
SELECT ROW_NUMBER() OVER () AS row_num, x, y
FROM functions)
SELECT DISTINCT f1.x, f1.y
FROM one f1
JOIN one f2
ON f1.x = f2.y AND f2.x = f1.y
WHERE f1.row_num != f2.row_num
AND f1.x <= f1.y
ORDER BY f1.x ASC
结果
做题心得
终于到55/58道题了。今天这道题虽然难度不大,但是确实是之前没有接触过的题型,下午尝试写了一下,发现思路不清晰,方向也不对,折腾了一个小时也没写出来。
后来吃饭的时候想想挺郁闷的,题目难度稍微提升一下就被难住了,但还是不甘心啊,心想今天不能放过这道题。于是走路回来的时候边走边想,突然发现原来逻辑很简单啊,只要用join加多个连接条件就可以了(主要是之前不知道能不能加多个,查了一下确认了可以),顿时思路清晰了,关于重复的问题,只要最后比较一下两列数,让第一列小于等于第二列就可以了。
于是回来快速地写了一下,小改了一下,加了一个distinct就通过了。
果然做题真的需要先理清思路,尽量用最简单的逻辑和思路,一步一步确认,最后整合起来,这样才能少走弯路啊,也算是刷题的一点点小心得吧。
刷完hackerrank,就要转战leetcode和牛客网去刷一些贴近实战的题了,继续给自己加油!