leetcode - 数据库 - 180. 连续出现的数字 --- 以及这道题中的一些坑,以及使用hive -- over()函数的答案。

      原题: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)

累了,歇一会再写。

      
      
      
      
      
      

发布了48 篇原创文章 · 获赞 36 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_42845682/article/details/105264355
今日推荐