鉴于SQL Server 2005上的这些数据:
SectionID Name
1 Dan
2 Dan
4 Dan
5 Dan
2 Tom
7 Tom
9 Tom
10 Tom
如何从同一名称的另一部分中选择sectionID必须为+ -2或更多的记录。
结果将是:
1 Dan
4 Dan
2 Tom
7 Tom
9 Tom
感谢阅读!
答案 0 :(得分:3)
SELECT *
FROM mytable a
WHERE NOT EXISTS
(SELECT *
FROM mytable b
WHERE a.Name = b.Name
AND a.SectionID = b.SectionID + 1)
答案 1 :(得分:0)
这是Anthony的答案的LEFT JOIN变体(从结果中删除连续的id)
SELECT a.*
FROM mytable a
LEFT JOIN mytable b ON a.Name = b.Name AND a.SectionID = b.SectionID + 1
WHERE b.SectionID IS NULL
编辑:由于对问题有另一种解释(只是得到id超过1个数字的结果),这是另一个尝试答案:
WITH alternate AS (
SELECT sectionid,
name,
EXISTS(SELECT a.sectionid
FROM mytable b
WHERE a.name = b.name AND
(a.sectionid = b.sectionid-1 or a.sectionid = b.sectionid+1)) as has_neighbour,
row_number() OVER (PARTITION by a.name ORDER BY a.name, a.sectionid) as row_no
FROM mytable a
)
SELECT sectionid, name
FROM alternate
WHERE row_no % 2 = 1 OR NOT(has_neighbour)
ORDER BY name, sectionid;
给出:
sectionid | name
-----------+------
1 | Dan
4 | Dan
2 | Tom
7 | Tom
9 | Tom
逻辑:如果记录具有相同名称且id为+/- 1的邻居,则每个奇数行都被占用,如果它没有这样的邻居,则无论是偶数还是奇数,它都会得到该行。
如评论中所述,条件不明确 - 在每个新序列的开始时,您可能以奇数行或偶数行开始,并且标准仍将满足不同的结果(即使结果数不同)。