sqlserver中的搜索序列模式
我有这样的记录,我想在SQL Server中按模式和顺序搜索,如(50,54,50)在值字段中,它应该返回02,03,04任何人都可以这样做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
======================================
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';