Хитрый SQL - выберите несмежные номера - PullRequest
5 голосов
/ 19 апреля 2010

С учетом этих данных на SQL Server 2005:

SectionID Name  
1         Dan  
2         Dan  
4         Dan  
5         Dan  
2         Tom  
7         Tom  
9         Tom  
10        Tom  

Как выбрать записи, в которых идентификатор раздела должен быть + -2 или более из другого раздела с тем же именем.

Результат будет:

1 Dan  
4 Dan  
2 Tom  
7 Tom  
9 Tom

Спасибо за чтение!

Ответы [ 2 ]

3 голосов
/ 19 апреля 2010
SELECT *
FROM mytable a
WHERE NOT EXISTS
  (SELECT *
  FROM mytable b
  WHERE a.Name = b.Name
  AND a.SectionID = b.SectionID + 1)
0 голосов
/ 19 апреля 2010

Вот вариант ответа ЛЕВОГО СОЕДИНЕНИЯ ответа Энтони (удаляет последовательные идентификаторы из результатов)

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

РЕДАКТИРОВАТЬ: Поскольку существует другая интерпретация вопроса (просто получение результатов, где идентификаторы находятся на расстоянии более 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

Логика: если запись имеет соседей с одинаковым именем и идентификатором +/- 1, то берется каждая нечетная строка, если у нее нет таких соседей, то она получает строку независимо от того, является ли она четной или нечетной.

Как указано в комментарии, условие является неоднозначным - при запуске каждой новой последовательности вы можете начинать с нечетных или четных строк, и критерии все равно будут удовлетворены с разными результатами (даже с разным количеством результатов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...