原题:https://leetcode-cn.com/problems/consecutive-numbers/
解题目录 https://blog.csdn.net/weixin_42845682/article/details/105196004
一、 题目描述
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
说几个需要注意的地方:
1. 是连续出现3次,而不是出现3次。
2. 如果大于3次,无论出现多少次,数字都只能出现一次。举个例子:3连续出现6次,最终结果里也只能有1个3。
二、 第一种答案 – mysql
我的答案:
select
distinct(n1) ConsecutiveNums /* 因为条件2,所以需要distinct */
from(
select
l1.id i1,
l1.num n1,
l2.id i2,
l2.num n2,
l3.id i3,
l3.num n3
from logs l1
join logs l2 on l1.id+1=l2.id
join logs l3 on l1.id+2=l3.id
) tmp
where n1 = n2
and n2 = n3
这里需要注意一下,where后面得写成:n1 = n2
and n2 = n3 。而不是n1 = n2 = n3,为什么呢?建议参考我写的这篇文章: Mysql中,1=1和 1=1=1 和 -1=-1 和 -1=-1=-1 和 5=5 和 5=5=5 有什么区别。地址是: https://blog.csdn.net/weixin_42845682/article/details/105262892
三、 第二种答案 – hive
其实用over()也可以做。但是mysql没有over(),为了图方便,我就用hive做了。
首先,为了图方便,开启hive的本地模式:
hive (test)> set hive.exec.mode.local.auto=true;
hive (test)> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=true
插入数据,查询看一下。
hive (test)> select * from logs;
OK
logs.id logs.num
1 1
2 1
3 1
4 2
5 1
6 2
7 2
Time taken: 0.047 seconds, Fetched: 7 row(s)
使用over()查询:
select
distinct(n1)
from(
select
id,
num n1,
lag(num,1) over( ) n2,
lag(num,2) over( ) n3
from logs
) t1
where n1 =n2
and n2=n3
四、 第三种答案 – hive 拓展
现在是要求连续出现3次,如果要求连续出现5次,连续出现10次呢?难道还要写那么多join或者那么多lag吗?
不行,得换个写法。
接下来在过程有点复杂,尽量看吧。。。
首先,这是原数据:
hive (test)> select * from logs;
OK
logs.id logs.num
1 1
2 1
3 1
4 2
5 1
6 2
7 2
Time taken: 0.027 seconds, Fetched: 7 row(s)
累了,歇一会再写。