Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlserver中的搜索序列模式_Sql_Sql Server_Database_Tsql - Fatal编程技术网

sqlserver中的搜索序列模式

sqlserver中的搜索序列模式,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我有这样的记录,我想在SQL Server中按模式和顺序搜索,如(50,54,50)在值字段中,它应该返回02,03,04任何人都可以这样做 ====================================== Id Date Value 01 2020-01-01 50 02 2020-01-02 50 03 2020-01-03

我有这样的记录,我想在SQL Server中按模式和顺序搜索,如(50,54,50)在值字段中,它应该返回02,03,04任何人都可以这样做

======================================
Id             Date             Value
01             2020-01-01       50
02             2020-01-02       50
03             2020-01-03       54
04             2020-01-04       50
05             2020-01-05       35
06             2020-01-06       98
07             2020-01-07       13
======================================

如果我得到你的要求正确,你可以尝试下面的逻辑开发的帮助下滞后和领先-


在用户语音网站上有一个请求,我相信这会允许的

同时,这应该满足您的需要

WITH T AS
(
SELECT *, 
       LAG(Id) OVER (ORDER BY Id) AS PrevId, 
       LAG(value) OVER (ORDER BY Id) AS PrevValue,
       LEAD(Id) OVER (ORDER BY Id) AS NextId, 
       LEAD(value) OVER (ORDER BY Id) AS NextValue
FROM YourTable
)
SELECT PrevId, Id, NextId
FROM T
WHERE PrevValue = 50 AND Value =54 AND NextValue = 50

如果您想要更灵活的方法,可以使用
交叉应用

select t2.*
from t cross apply
     (select string_agg(id, ',') within group (order by date) as ids,
             string_agg(value, ',') within group (order by date) as vals
      from (select top (3) t2.*
            from t t2
            where t2.date >= t.date
            order by t2.date
           ) t2
     ) t2
where vals = '50,54,50';
他是一把小提琴

如果
string\u agg()
作为窗口函数受支持,则可以使用:

select t.*
from (select t.*,
             string_agg(id, ',') within group (order by date) over (order by id rows between current row and 2 following) as ids,
             string_agg(value, ',') within group (order by date) over (order by id rows between current row and 2 following) as vals
      from t
     ) t
where vals = '50,54,50';

但遗憾的是,事实并非如此。

你尝试过什么?你在哪里卡住了?请为你的逻辑和要求添加更多的解释,看起来IN子句可以满足你的要求。如果Where子句中的序列太长,这是不可能的。那么你要匹配多长的序列?@MartinSmith。我希望看到对数组的完全支持,这也可以用于此目的。如果where子句中的序列太长,这是不可能的。请提及最坏的可能性。是的,我也考虑了
string\u agg
。他们可能只是
string_agg
整批,然后根据序列可能包含的行数使用正则表达式来查找他们的模式
select t.*
from (select t.*,
             string_agg(id, ',') within group (order by date) over (order by id rows between current row and 2 following) as ids,
             string_agg(value, ',') within group (order by date) over (order by id rows between current row and 2 following) as vals
      from t
     ) t
where vals = '50,54,50';