【问题标题】:How to have OFFSET/FETCH and WITH TIES together?如何将 OFFSET/FETCH 和 WITH TIES 结合在一起?
【发布时间】:2015-07-20 07:18:36
【问题描述】:

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

有什么解决方法可以将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'

热门

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_RANKROW_NUMBER。找出 DENSE_RANKn'th ROW_NUMBER 的值是什么,然后选择这些行。
  • "... 通过返回所有关系来确保确定性" - 当然,确保确定性的另一种方法是避免关系 - 找到足够的列/表达式,以便 ORDER BY 始终足以唯一排序结果集的行。

标签: sql sql-server tsql sql-server-2012 sql-order-by


【解决方案1】:

只需在 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

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

【讨论】:

  • 感谢您的回复,但是当您想要偏移 3 行并获取接下来的 3 行但有关联时,您该怎么做。在您的回答中,不需要表表达式,您可以将其删除并在主查询中使用 TOP 3。
  • 好的。我会尽力解释。如果要偏移 3 行,只需使用 OFFSET 3 ROWS 子句,如果需要获取 3 行并使用 SELECT TOP 3 WITH TIES * 子句。我已经为你举了例子。
  • 问题是:OFFSET n(3) ROWS 然后 FETCH NEXT n(3) ROWS 但有联系。
  • 我为你创建了新的例子。
  • 谢谢。好的和简单的解决方案。希望它可以帮助别人。关键是偏移几行后就不需要获取了。
【解决方案2】:
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS WITH TIES 

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
  • 到目前为止,SQL Server 仅支持标准 SQL 语法中的ROWS ONLYdocs.microsoft.com/en-us/sql/t-sql/queries/…
  • 好的,我会记住的! @RanMarciano
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2021-12-25
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多