棘手的SQL - 选择不相邻的数字

时间:2010-04-19 08:55:44

标签: sql sql-server-2005

鉴于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

感谢阅读!

2 个答案:

答案 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的邻居,则每个奇数行都被占用,如果它没有这样的邻居,则无论是偶数还是奇数,它都会得到该行。

如评论中所述,条件不明确 - 在每个新序列的开始时,您可能以奇数行或偶数行开始,并且标准仍将满足不同的结果(即使结果数不同)。