[英]Can SQL Server limit results in query based on rank without using cte?
I have been able to successfully use a cte with below SQL that contains rank that gives me output. 我已经能够在下面的SQL中成功使用cte,该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
My question is can this be done WITHOUT using a cte? 我的问题是,无需使用cte就能完成此操作吗?
You can use OUTER APPLY
as a correlated subquery. 您可以将
OUTER APPLY
用作相关子查询。 This is also known as a LATERAL
join or view in some RDBMSs (Oracle, PostgreSQL). 在某些RDBMS(Oracle,PostgreSQL)中,这也称为
LATERAL
或视图。 It looks like a LEFT JOIN
, but it generally performs much better. 它看起来像一个
LEFT JOIN
,但通常性能要好得多。
Real life example, when to use OUTER / CROSS APPLY in SQL 实际示例,何时在SQL中使用OUTER / CROSS APPLY
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
That question links to an article with several solutions for the "greatest N per group" problem . 该问题与具有“最大每组N个”问题的几种解决方案的文章相关联。 It doesn't format well for me, but it does seem to be a good article otherwise.
它对我来说格式不佳,但在其他方面看来确实不错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.