【发布时间】:2015-07-20 07:18:36
【问题描述】:
OFFSET FETCH 不支持与TOP (n) WITH TIES 选项的逻辑等价,该选项通过返回所有关系来确保确定性。
有什么解决方法可以将OFFSET FETCH 和WITH TIES 放在一起吗?
使用示例数据创建语句
CREATE TABLE #tbl(Id INT, Name VARCHAR(10))
INSERT #tbl
SELECT 1, 'a' UNION ALL
SELECT 1, 'a' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c'
热门
SELECT TOP 3 * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
领带前 n 名
SELECT TOP 3 WITH TIES * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
2 b
2 b
偏移量获取
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
Id Name
1 a
1 a
2 b
可能我们需要使用Ranking函数来实现这个??
【问题讨论】:
-
"可能我们需要使用Ranking函数来实现这个??"我猜你回答了你自己的问题。我猜你必须在那边同时使用
DENSE_RANK和ROW_NUMBER。找出DENSE_RANK的n'thROW_NUMBER的值是什么,然后选择这些行。 -
"... 通过返回所有关系来确保确定性" - 当然,确保确定性的另一种方法是避免关系 - 找到足够的列/表达式,以便
ORDER BY始终足以唯一排序结果集的行。
标签: sql sql-server tsql sql-server-2012 sql-order-by