题目描述
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
在 SQL 中, id 是该表的主键
id 是一个自增列
- 找出所有至少连续出现三次的数字
- 返回的结果表中的数据可以按任意顺序排列
示例
输入
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
输出
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
解释
MySQL实现
方法1
select distinct num as ConsecutiveNums
from (select *, lead(rn, 2) over (partition by num order by rn) as rn_lead
from (select num, row_number() over () as rn from Logs) t1) t2
where rn_lead - rn = 2;
方法2
select distinct num as ConsecutiveNums
from (select num,
row_number() over () as rn1,
row_number() over (partition by num order by id) as rn2
from Logs
order by num, id) t
group by num, rn1 - rn2
having count(rn1 - rn2) >= 3;
Pandas实现
import pandas as pd
def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
if logs.empty:
return pd.DataFrame(columns=['ConsecutiveNums'])
logs['rn'] = logs.reset_index(drop=True).index + 1
grouped = logs.groupby('num')
result = []
for name, group in grouped:
group = group.copy()
group['rn_lead'] = group['rn'].shift(-2)
result.append(group)
df = pd.concat(result)
df = df[df['rn_lead'] - df['rn'] == 2]
return df['num'].drop_duplicates().to_frame(name='ConsecutiveNums')