我创建了以下表格:

id val
1 0
2 1
3 0
4 1
5 1
6 1
7 0
Create Table Test3
(
    id int,
    val int
)

Insert Into Test3 Values (1,0),(2,1),(3,0),(4,1),(5,1),(6,1),(7,0)

我想要输出为

id
4
5
6

因为在[VAL]列中连续的三个值相同.如果第7行也有1,则该id号也应该反映在输出中.

我怎么才能解决这个问题?

我已经try 了Self Join,但没有得到预期的输出. 提前谢谢您!

推荐答案

您可以使用LAGLEAD来执行此操作:

SELECT id, val
  FROM (
SELECT *, CASE WHEN (Val = LAG(Val,1) OVER (ORDER BY ID) AND Val = LAG(Val,2) OVER (ORDER BY ID)) 
                 OR (Val = LEAD(Val,1) OVER (ORDER BY ID) AND Val = LEAD(Val,2) OVER (ORDER BY ID)) 
                 OR (Val = LEAD(Val,1) OVER (ORDER BY ID) AND Val = LAG(Val,1) OVER (ORDER BY ID)) 
                 THEN 1 ELSE 0 END AS Cnte
  FROM Test3
       ) a
 WHERE Cnte >= 1;
ID Val
4 1
5 1
6 1

如果您扩展示例数据:

VALUES (1,0),(2,1),(3,0),(4,1),(5,1),(6,1),(7,0),(8,3),(9,3),(10,3),(11,10),(12,4),(13,4),(15,4),(16,4)
ID Val
4 1
5 1
6 1
8 3
9 3
10 3
12 4
13 4
15 4
16 4

Sql相关问答推荐

如何实现一个广泛的多级自连接PostgreSQL查询?

SQL是否可以计算每年的所有日期变化?

Postgres trunc_date删除一个月

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

SQL:如何取上一年的平均值?

如何根据行状态设置正确的标志

将FLOAT转换为VARBINARY,然后再转换回FLOAT

在SQL中将项分配给容器

Haystack针相交-在元素最多的Haystack中查找集合

查找滑动窗口框架中的最大和最小列值

Snowflake 中的分层数据

将 jsonb 数组中的对象取消嵌套到单独的行中

根据要过滤的列的值进行联接和分组

SQL Server:时态表并在运行时添加计算列

BigQuery数组是否包含NULL值的判断方法

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

HIVE SQL where 子句未按预期工作

以 15 分钟为间隔的使用情况SQL 查询

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数

如何在 SQL Server 中参数化 Select top 'n'