【数据分析面试】37.找出连续出现3次的数字(SQL:LEAD()和 LAG()的使用)

在这里插入图片描述

题目: 找出连续出现3次的数字

给定一个日志表 Logs,包含两列:IdNum。请编写一个 SQL 查询,找出在 Num 列中连续出现至少三次的数字。

示例:

输入:

Logs 表格:

IdNum
11
21
31
42
51
62
72

输出:

ConsecutiveNums
1

答案

解题思路

通过使用窗口函数,我们可以将每个数字的前两个相邻数字与当前数字进行比较,以确定是否存在连续出现三次的情况。

答案代码

SELECT DISTINCT Num as ConsecutiveNums
FROM(
    SELECT Id,Num,
    Lead(Num,1)OVER() as num_1, -- 选择指定行的向下一行的内容
    Lead(Num,2)OVER() as num_2  -- 选择指定行的向下两行的内容
    FROM Logs
) as c
WHERE c.Num = c.num_1 AND c.num_1 = c.num_2 -- 这三个数都要相等。

这段代码中,我们使用了 Lead() 函数来获取当前行的后两行的 Num 值,并通过比较确定是否连续出现了三次相同的数字。

窗口函数LEAD()LAG()的区别

当使用窗口函数时,LEAD()LAG() 函数都用于访问当前行之前或之后的行的值,但它们的行为略有不同。

让我们通过一个简单的示例来说明它们之间的区别:

假设我们有以下数据表 Numbers

IdValue
110
220
330
440
550

现在,我们想要查询每一行的 Value 值,并且获取其前一行和后一行的值。

SELECT
    Id,
    Value,
    LAG(Value) OVER (ORDER BY Id) AS PreviousValue,
    LEAD(Value) OVER (ORDER BY Id) AS NextValue
FROM Numbers;

这会产生以下结果:

IdValuePreviousValueNextValue
110(null)20
2201030
3302040
4403050
55040(null)
  • LAG(Value) OVER (ORDER BY Id): 返回按照 Id 排序的前一行的 Value 值。对于第一行,因为没有前一行,所以返回 null
  • LEAD(Value) OVER (ORDER BY Id): 返回按照 Id 排序的后一行的 Value 值。对于最后一行,因为没有后一行,所以返回 null

所以,LAG()LEAD() 分别获取了前一行和后一行的值,并根据指定的排序条件进行操作。

更多详细答案可关注公众号查阅。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值