Как я могу искать строки «вокруг» заданного строкового значения? - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть таблица с полем varchar() с именем identifier, в котором содержится уникальное имя для сущности.

Я хотел бы найти в таблице и найти строки с заданным идентификатором и до 10 строк по обе стороны от этого идентификатора, отсортированные в алфавитном порядке (т. Е. Искомый идентификатор и соседние с ним ряды с обеих сторон).

Каков наилучший способ сформулировать это в SQL Server 2005? Я предполагаю, что есть какая-то магия ROW_NUMBER(), которая может сделать это, но я не нахожу никаких запросов на переход, чтобы сделать подобные вещи.

Это настолько близко, насколько я могу понять, но производительность ужасна :

WITH 
  allrows AS (
   SELECT *, ROW_NUMBER() OVER(ORDER BY identifier DESC) AS RN
       FROM mytable
  ),
  centerrow AS (
    SELECT RN AS CRN FROM allrows WHERE identifier = 'MyValue'
  )
SELECT * FROM allrows, centerrow 
WHERE RN BETWEEN (centerrow.CRN - 10) AND (centerrow.CRN + 10)

В таблице содержится более 2 миллионов записей, а поле идентификатора может содержать до 1000 символов.

Ответы [ 2 ]

5 голосов
/ 17 февраля 2012
SELECT TOP 11 * FROM MyTable WHERE identifier >= 'My Value' ORDER BY identifier ASC
UNION ALL
SELECT TOP 10 * FROM MyTable WHERE identifier < 'My Value' ORDER BY identifier DESC
2 голосов
/ 17 февраля 2012

Этот ответ немного более удобен для компиляции

declare @e table(identifier varchar(5))
insert @e values (0),(1),(2),(3),(4)

SELECT * FROM(
SELECT top 2 * 
FROM @e WHERE 
identifier >= '2' 
ORDER BY identifier asc) a
UNION ALL 
SELECT * FROM (
SELECT top 1 * 
FROM @e 
WHERE identifier < '2' 
ORDER BY identifier desc ) b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...