问题:
我们在表格中有许多条目,但我们只对出现在给定序列中的条目感兴趣。例如,我们正在寻找三个特定的“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来做到这一点但是一些帮助会很棒。
干杯
答案 0 :(得分: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'
答案 1 :(得分:0)
假设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)
;
您也可以尝试at SQL Fiddle。