如何在SQL Server 2008中搜索表中的给定行序列

时间:2013-02-19 00:23:18

标签: sql-server-2008 sequence

问题:

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

RowNum  GFTitle
------------------------------
   1    Pearson Grafton
   2    Woolworths (P and O)
   3    QRX - Brisbane
   4    Pearson Grafton
   5    Woolworths (P and O)
   6    Pearson Grafton
   7    QRX - Brisbane
   8    Pearson Grafton
   9    Pearson Grafton

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

我确信有一种方法可以通过CTE来做到这一点但是一些帮助会很棒。

干杯

2 个答案:

答案 0 :(得分:1)

使用即使是好的旧工具也很简单:-)尝试这个快速而肮脏的解决方案,假设您的表名为GFTitlesRowNumber值是连续的:

SELECT a.[RowNum]
      ,a.[GFTitle]
      ,b.[GFTitle]
      ,c.[GFTitle]
 FROM [dbo].[GFTitles] as a
      join [dbo].[GFTitles] as b on b.RowNumber = a.RowNumber + 1
      join [dbo].[GFTitles] as c on c.RowNumber = a.RowNumber + 2
WHERE a.[GFTitle] = 'Pearson Grafton' and
      b.[GFTitle] = 'Woolworths (P and O)' and
      c.[GFTitle] = 'QRX - Brisbane'

答案 1 :(得分:0)

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

  1. 为搜索到的序列的项目分配行号,并在GFTitle上将行集加入到您的表格中。

  2. 对于每个匹配项,计算表的行号与序列的行号之间的差异。如果表格中存在匹配的序列,则相应的行“RowNum差异将相同。

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

  4. 这是一个实现上述逻辑的查询:

    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)
    ;
    

    您也可以尝试at SQL Fiddle