Row_number 和包装选择?

Roy*_*mir 2 sql-server-2008-r2

我有这个代码:

Select name, age , row_number() over (partition by name order by age desc) rn from my table

(目标:选择同名中最年长的人)

如果我想选择所有行编号的记录1,我想我必须这样做:

Select ... from ( above query) where rn=1

但这迫使我用另一个select.

有没有其他解决方案而不是包装select?(cte也像包裹)

Mar*_*ith 5

通常是不可能的,但在您的问题中的特定情况下。

仅在此处逻辑查询处理流程图(TheSELECTORDER BY)中的步骤 5.1 和 6 中允许使用窗口函数。

SELECT不能用于减少返回的行。在 SQL Server 2008ORDER BY中只能结合使用TOP(对于 2012OFFSET ... FETCH可以在 基础上进行过滤ORDER)。因为您只对ROW_NUMBER表达式1在这种情况下评估为的那些感兴趣,所以您可以使用

SELECT TOP (1) WITH TIES name,
                         age
FROM   mytable
ORDER  BY row_number() OVER (partition BY name ORDER BY age DESC) 
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

在评论中讨论如何扩展以获得TOP 2每个分区。这将是可能的

SELECT TOP (1) WITH TIES name,
                         age
FROM   mytable
ORDER  BY CASE
            WHEN row_number() OVER (partition BY name ORDER BY age DESC) <= 2 THEN 0
            ELSE 1
          END 
Run Code Online (Sandbox Code Playgroud)

不过,我个人不会使用此答案中的任何一个查询。我只是将查询包装在表表达式中并使用WHERE.