加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 如何使用TSQL识别记录中的记录模式序列?

发布时间:2021-04-02 02:10:25 所属栏目:编程 来源:网络整理
导读:这对我来说是一个相等新的操练,但我必要找到一种要领来辨认表格中的模式序列. 譬喻,假设我有一个相同于以下内容的简朴表: 此刻我想要做的是辨认和分组全部具有值为5,9和6的序列模式的记录,并在查询中表现它们.你会怎样行使T-SQL完成这项使命? 功效应如下所

这对我来说是一个相等新的操练,但我必要找到一种要领来辨认表格中的模式序列.
譬喻,假设我有一个相同于以下内容的简朴表:

此刻我想要做的是辨认和分组全部具有值为5,9和6的序列模式的记录,并在查询中表现它们.你会怎样行使T-SQL完成这项使命?

功效应如下所示:

我已经找到了一些也许实现这一方针的隐藏例子,却找不到真正有效的对象.

办理要领

您可以行使包括在CTE中的以下查询,以便将序列号分派给序列中包括的值:
;WITH Seq AS (
    SELECT v,ROW_NUMBER() OVER(ORDER BY k) AS rn
    FROM (VALUES(1,5),(2,9),(3,6)) x(k,v)
)

输出:

v   rn
-------
5   1
9   2
6   3

行使上面的CTE,您可以辨认孤岛,即包括整个序列的持续行的切片:

;WITH Seq AS (
    SELECT v,v)
),Grp AS (
SELECT [Key],[Value],ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp            
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT *
FROM Grp

输出:

Key Value   grp
   -----------------
    1   5       0
    2   9       0
    3   6       0
    6   5       3
    7   9       3
    8   6       3

grp字段可辅佐您精确辨认这些岛屿.

您此刻必要做的就是过滤掉部门组:

;WITH Seq AS (
    SELECT v,ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp            
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT g1.[Key],g1.[Value]
FROM Grp AS g1
INNER JOIN (
   SELECT grp
   FROM Grp
   GROUP BY grp
   HAVING COUNT(*) = 3 ) AS g2
ON g1.grp = g2.grp

Demo here

留意:此谜底的初始版本行使INNER JOIN到Seq.假如表包括5,42,9,6等值,则这将无效,由于42将被INNER JOIN过滤掉,而且此序列被错误地辨认为有用序列.感激@HABO举办此编辑.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读