1

问题:

我们在一个表中有许多条目,但我们只对出现在给定序列中的条目感兴趣。例如,我们正在寻找三个特定的“GFTitle”条目('Pearson Grafton'、'Woolworths (P and 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 做到这一点,但一些帮助会很棒。

干杯

4

2 回答 2

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'
于 2013-02-19T19:53:39.070 回答
0

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

  1. 将行号分配给寻找的序列的项目,并将行集加入到您的表中GFTitle

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

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

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

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

您也可以在 SQL Fiddle上尝试一下。

于 2013-02-19T21:24:37.937 回答