Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql server 2008 如何在SQLServer2008中搜索表中给定的行序列_Sql Server 2008_Sequence - Fatal编程技术网

Sql server 2008 如何在SQLServer2008中搜索表中给定的行序列

Sql server 2008 如何在SQLServer2008中搜索表中给定的行序列,sql-server-2008,sequence,Sql Server 2008,Sequence,问题是: 我们在一个表中有许多条目,但我们只对在给定序列中出现的条目感兴趣。例如,我们正在寻找三个特定的“GFTitle”条目(“Pearson Grafton”、“Woolworths(P和O)”、“QRX-Brisbane”),但它们必须以特定顺序出现才能被视为有效路径。(见下图) 因此,行(1,2,3)满足此规则,但行(4,5,6)不满足此规则,即使前两个条目(4,5)满足此规则 我相信有办法通过CTE做到这一点,但一些帮助将是伟大的 干杯即使使用很好的旧工具,这也非常简单:-)假设您的表

问题是:

我们在一个表中有许多条目,但我们只对在给定序列中出现的条目感兴趣。例如,我们正在寻找三个特定的“GFTitle”条目(“Pearson Grafton”、“Woolworths(P和O)”、“QRX-Brisbane”),但它们必须以特定顺序出现才能被视为有效路径。(见下图)

因此,行(1,2,3)满足此规则,但行(4,5,6)不满足此规则,即使前两个条目(4,5)满足此规则

我相信有办法通过CTE做到这一点,但一些帮助将是伟大的


干杯

即使使用很好的旧工具,这也非常简单:-)假设您的表名是
GFTitles
,并且
RowNumber
值是连续的,请尝试此快速而肮脏的解决方案:

选择一个[RowNum]
,a.[GFTitle]
,b.[标题]
,c.[标题]
来自[dbo].[GFTitles]作为
在b.RowNumber=a.RowNumber+1上将[dbo].[GFTitles]作为b连接
将[dbo].[GFTitles]作为c上的c连接到c.RowNumber=a.RowNumber+2
其中a.[GFTitle]=“Pearson Grafton”和
b、 [GFTitle]=“Woolworths(P和O)”和
c、 [GFTitle]=“QRX-布里斯班”

即使使用很好的旧工具,这也非常简单:-)假设您的表名是
GFTitles
,并且
行数
值是连续的,请尝试此快速而肮脏的解决方案:

选择一个[RowNum]
,a.[GFTitle]
,b.[标题]
,c.[标题]
来自[dbo].[GFTitles]作为
在b.RowNumber=a.RowNumber+1上将[dbo].[GFTitles]作为b连接
将[dbo].[GFTitles]作为c上的c连接到c.RowNumber=a.RowNumber+2
其中a.[GFTitle]=“Pearson Grafton”和
b、 [GFTitle]=“Woolworths(P和O)”和
c、 [GFTitle]=“QRX-布里斯班”

假设
RowNum
既没有重复项也没有间隙,可以尝试以下方法

  • 将行号分配给搜索序列的项目,并将行集合加入
    GFTitle
    上的表中

  • 对于每个匹配,计算表的行号与序列的行号之间的差值。如果表中有匹配的序列,则相应行的RowNum差异将相同

  • 计算每个差异的行数,并仅返回计数与序列项数匹配的行数

  • 下面是一个实现上述逻辑的查询:

    WITH SoughtSequence AS (
      SELECT *
      FROM (
        VALUES
          (1, 'Pearson Grafton'),
          (2, 'Woolworths (P and O)'),
          (3, 'QRX - Brisbane')
      ) x (RowNum, GFTitle)
    )
    , joined AS (
      SELECT
        t.*,
        SequenceLength = COUNT(*) OVER (PARTITION BY t.RowNum - ss.RowNum)
      FROM atable t
      INNER JOIN SoughtSequence ss
      ON t.GFTitle = ss.GFTitle
    )
    SELECT
      RowNum,
      GFTitle
    FROM joined
    WHERE SequenceLength = (SELECT COUNT(*) FROM SoughtSequence)
    ;
    

    您也可以尝试。

    假设
    RowNum
    既没有重复项也没有间隙,您可以尝试以下方法

  • 将行号分配给搜索序列的项目,并将行集合加入
    GFTitle
    上的表中

  • 对于每个匹配,计算表的行号与序列的行号之间的差值。如果表中有匹配的序列,则相应行的RowNum差异将相同

  • 计算每个差异的行数,并仅返回计数与序列项数匹配的行数

  • 下面是一个实现上述逻辑的查询:

    WITH SoughtSequence AS (
      SELECT *
      FROM (
        VALUES
          (1, 'Pearson Grafton'),
          (2, 'Woolworths (P and O)'),
          (3, 'QRX - Brisbane')
      ) x (RowNum, GFTitle)
    )
    , joined AS (
      SELECT
        t.*,
        SequenceLength = COUNT(*) OVER (PARTITION BY t.RowNum - ss.RowNum)
      FROM atable t
      INNER JOIN SoughtSequence ss
      ON t.GFTitle = ss.GFTitle
    )
    SELECT
      RowNum,
      GFTitle
    FROM joined
    WHERE SequenceLength = (SELECT COUNT(*) FROM SoughtSequence)
    ;
    

    您也可以尝试。

    欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(
    {}
    ),以很好地格式化和语法突出显示它!欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
    {}
    ),以精确地格式化和语法突出显示它!谢谢你,塞格。如果这个解决方案总是只有三个GFTitles,那么这个解决方案就可以很好地工作,但是这个解决方案必须能够扩展,正如Andrie M所说,这就是我遇到的问题。要使它具有可扩展性,这不是一个问题-只要需要,就使用动态SQL和form SQL命令:-)但是,当然,这不是功能齐全的解决方案,只是作为对您的问题的快速回答提供的。谢谢您。如果这个解决方案总是只有三个GFTitles,那么这个解决方案就可以很好地工作,但是这个解决方案必须能够扩展,正如Andrie M所说,这就是我遇到的问题。要使它具有可扩展性,这不是一个问题-只要需要,就使用动态SQL和form SQL命令:-)但是,当然,这不是一个功能齐全的解决方案,是作为对您的问题的快速回答提供的。谢谢您,安德烈·M。这正是我想要的解决方案。我需要更多地使用CTE,因为我相信它们是非常强大的工具。我只是觉得很难完全理解它们是如何运行的。当我开始将它们视为可视范围有限的视图(视图仅适用于定义它们的上下文的语句)时,这有助于我更好地理解CTE。谢谢Andrry M。这正是我所寻找的解决方案。我需要更多地使用CTE,因为我相信它们是非常强大的工具。我只是觉得很难完全理解它们是如何运行的。当我开始将它们视为可视范围有限的视图(视图仅适用于定义它们的上下文的语句)时,这有助于我更好地理解CTE。