SQL刷题,advanced join,窗口函数(hackerrank-sql-Symmetric Pairs)

题目

在这里插入图片描述
在这里插入图片描述

本人的解法一

-- 先用窗口函数给数据加上行号,之后用两个表格连接,多个筛选条件
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和牛客网去刷一些贴近实战的题了,继续给自己加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值