编写T-SQL查询以查找至少连续出现三次的所有数字

编写T-SQL查询以查找至少连续出现三次的所有数字,sql,sql-server,tsql,Sql,Sql Server,Tsql,这是Leetcode提出的问题。我已经用MySQL完成了,但我真的不知道如何将其转换为t-sql查询 例如,给定日志表,1是唯一连续出现至少三次的数字 +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+ 我对MySQL的逻辑如下: SELECT DISTINCT

这是Leetcode提出的问题。我已经用MySQL完成了,但我真的不知道如何将其转换为t-sql查询

例如,给定
日志
表,1是唯一连续出现至少三次的数字

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+
我对MySQL的逻辑如下:

SELECT DISTINCT Num AS ConsecutiveNums
  FROM(
 SELECT Num, @times := IF(@prev = Num, @times + 1, 1) AS Consecutivetimes, @prev := Num
   FROM Logs, (SELECT @times := 1, @prev := -1) AS init) AS p
 WHERE Consecutivetimes >= 3
但是赋值
@times:=IF(@prev=Num,@times+1,1)作为连续时间,@prev:=Num
应该如何用T-SQL编写

我尝试使用
选择
来赋值

DECLARE @times INT, @prev INT;
SET @times = 1;
SET @prev = -1;
SELECT DISTINCT Num AS ConsecutiveNums
FROM(
    SELECT Num,
    (SELECT CASE WHEN @prev = Num
          THEN
            BEGIN
                @times = @times + 1 
                @prev = Num
            END
          ELSE
            BEGIN
                @times = 1
                @prev = Num
            END 
          END) AS Consecutivetimes
    FROM Logs) t
WHERE Consecutivetimes >= 3;
我会使用
lag()


您的T-SQL尝试是什么?如果我们为您回答这个问题,您将一无所获。@Larnu抱歉,我已经更新了我的尝试。MySQL 8不再需要这种古怪的更新黑客(这就是它的名字,因为它取决于特定的怪癖,比如缺乏并行性)谢谢,这种方法可以工作。但我仍在试图弄清楚如何像MySQL那样赋值。@intteng为什么?这是一个非常丑陋的黑客在旧的MySQL版本中使用,没有像LAG这样的窗口功能。要工作,它需要连续执行查询,而且运气好——在旧的MySQL查询中没有指定任何ORDER BY,因此结果的顺序是不确定的
select distinct num
from (select l.*,
             lag(num) over (order by id) as prev_num,
             lag(num, 2) over (order by id) as prev2_num
      from logs l
     ) n
where prev_num = num and prev2_num = 2;