简体   繁体   English

SQL Server是否可以在不使用cte的情况下基于排名限制查询结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM