如何将 OFFSET/FETCH 和 WITH TIES 放在一起?

sql*_*ser 6 sql t-sql sql-server sql-order-by sql-server-2012

OFFSET FETCH不支持与TOP (n) WITH TIESoption的逻辑等价,它通过返回所有关系来确保确定性。

有任何解决方法有OFFSET FETCHWITH 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'
Run Code Online (Sandbox Code Playgroud)

最佳

SELECT TOP 3 * FROM #tbl ORDER BY Id

Id  Name
1   a
1   a
2   b
Run Code Online (Sandbox Code Playgroud)

有关系的前 n 名

SELECT TOP 3 WITH TIES * FROM #tbl ORDER BY Id

Id  Name
1   a
1   a
2   b
2   b
2   b
Run Code Online (Sandbox Code Playgroud)

偏移获取

SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY

Id  Name
1   a
1   a
2   b
Run Code Online (Sandbox Code Playgroud)

大概我们需要使用Ranking函数来实现这个??

Ale*_*nko 4

只需将它们一起使用,无需在 CTE 内使用 FETCH 语句

;WITH cte AS
 (
  SELECT Id, Name
  FROM #tbl
  ORDER BY Id
  OFFSET 0 ROWS
  )
  SELECT TOP 3 WITH TIES *
  FROM cte
  ORDER BY Id
Run Code Online (Sandbox Code Playgroud)

SQLFiddle

偏移量为 3 SQLFiddle的示例

;WITH cte AS
 (
  SELECT Id, Name
  FROM #tbl
  ORDER BY Id
  OFFSET 3 ROWS
  )
  SELECT TOP 3 WITH TIES *
  FROM cte
  ORDER BY Id
Run Code Online (Sandbox Code Playgroud)