我在SQLServer 2008r2中有一个表,如下所示。
我想选择[Fg]
列= 1的所有记录,其中[Id]
订单导致每个[T_Id]
和[N_Id]
组合连续导入值2。
有些情况可能会导致[Fg]
= 2之前的记录没有&t = 1
[Fg]
= 1的值可以有任意数量的记录,但每个[Fg]
和[T_Id]
组合的[N_Id]
= 2只有一条记录。
因此,对于下面的示例,我想选择[Id]
s(4,5)和(7,8,9)和(19,20)的记录。
排除[T_Id]
3和4的所有记录。
预期输出
示例数据集
DECLARE @Data TABLE ( Id INT IDENTITY (1,1), T_Id INT, N_Id INT, Fg TINYINT )
INSERT INTO @Data
(T_Id, N_Id, Fg)
VALUES
(1, 2, 0), (1, 2, 1), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 3, 0), (2, 3, 1),
(2, 3, 1), (2, 3, 2), (3, 4, 0), (3, 4, 0), (3, 4, 0), (3, 4, 2), (4, 5, 0),
(4, 5, 1), (4, 5, 0), (4, 5, 2), (5, 7, 0), (5, 7, 1), (5, 7, 2)
答案 0 :(得分:12)
可以使用recursive CTE
:
WITH DataSource AS
(
SELECT DS1.*
FROM @Data DS1
INNER JOIN @Data DS2
ON DS1.[T_Id] = DS2.[T_Id]
AND DS1.[N_Id] = DS2.[N_Id]
AND DS1.[Id] = DS2.[Id] + 1
AND DS1.[Fg] = 2
AND DS2.[Fg] = 1
UNION ALL
SELECT DS1.*
FROM @Data DS1
INNER JOIN DataSource DS2
ON DS1.[T_Id] = DS2.[T_Id]
AND DS1.[N_Id] = DS2.[N_Id]
AND DS1.[Id] = DS2.[Id] - 1
AND DS1.[Fg] = 1
)
SELECT *
FROM DataSource
ORDER BY Id
这个想法很简单。查询的第一部分获取valid
所有fg = 2
条记录 - 有效表示此记录之前有来自同一组fg = 1
的记录。
然后在递归部分,我们得到的所有记录都小于初始记录,其中fg = 1
。
答案 1 :(得分:0)
您无法使用滞后/潜在客户,因为它始于SQL 2012,您需要执行以下操作。
SELECT fg - (
SELECT TOP 1 fg
FROM table m2
WHERE m2.fg = m1.fg-1 OR (m2.fg = m1.fg AND m2.id < m1.id)
ORDER BY
fg, id
)
FROM table m1
ORDER BY
fg, id