1

問題:

テーブル内には多数のエントリがありますが、特定の順序で表示されるエントリのみに関心があります。たとえば、3つの特定の「GFTitle」エントリ(「PearsonGrafton」、「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)はこのルールを満たしますが、最初の2つのエントリ(4,5)は満たしても、行(4,5,6)は満たしません。

CTEを介してこれを行う方法があると確信していますが、いくつかの助けがあれば素晴らしいでしょう。

乾杯

4

2 に答える 2

1

GFTitlesこれは、古き良きツールを使用しても非常に簡単です:-)テーブル名がであり、RowNumber値が連続していると仮定して、この手っ取り早い解決策を試してください。

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

SQLFiddleでも試すことができます。

于 2013-02-19T21:24:37.937 に答える