SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?
Posted
技术标签:
【中文标题】SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?【英文标题】:Can SQL Server limit results in query based on rank without using cte? 【发布时间】:2015-03-17 19:58:27 【问题描述】:我已经能够成功地使用具有以下 SQL 的 cte,其中包含为我提供输出的排名。
WITH cte AS (
SELECT foo, bar,
rank() OVER(PARTITION BY foo ORDER BY bar) AS [rank]
FROM baz)
select * from cte where [rank]=1
我的问题是不使用 cte 可以做到这一点吗?
【问题讨论】:
我猜你的意思也是没有子查询,不是吗? 您可以使用子查询来实现 - 但本质上是一样的 您可以改用派生表,但这也是一样的。从 SQL Server 2012 开始,您可以使用ORDER BY...FETCH
@Lamak ORDER BY ... OFFSET ... FETCH
并没有真正的帮助。这是greatest n per group 问题,不是窗口问题。
你能告诉我们你为什么不想使用 CTE... 特别是。如果它有效。它可以帮助我们提出一种替代方法。
【参考方案1】:
您可以使用OUTER APPLY
作为相关子查询。这在某些 RDBMS(Oracle、PostgreSQL)中也称为LATERAL
连接或视图。它看起来像 LEFT JOIN
,但通常表现要好得多。
Real life example, when to use OUTER / CROSS APPLY in SQL
SELECT pr.name,
pa.name
FROM sys.procedures pr
OUTER APPLY (SELECT TOP 2 *
FROM sys.parameters pa
WHERE pa.object_id = pr.object_id
ORDER BY pr.name) pa
ORDER BY pr.name,
pa.name
该问题链接到带有several solutions for the "greatest N per group" problem 的文章。它的格式对我来说不太好,但它似乎确实是一篇好文章。
【讨论】:
以上是关于SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 join 或 cte 的情况下在同一查询中使用动态生成的列