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