我有一个表,其中有一个名为identifier
的varchar()
字段,该字段包含实体的唯一名称。
我想搜索该表,并在该标识符的两侧找到具有给定标识符和的行,最多10行,按字母顺序排序(即,搜索到的标识符及其两侧的相邻行)。
在SQLServer2005中对此进行表述的最佳方式是什么?我猜有一些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)
该表有200多万条记录,标识符字段可以长达1000个字符。
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
这个答案更适合
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