我有这段代码:
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也像包装一样)
我有这段代码:
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也像包装一样)
这通常是不可能的,但在您问题的特定情况下。
仅在此处的逻辑查询处理流程图中的步骤 5.1 和 6 中允许使用窗口函数(The
SELECT
和ORDER BY
)。SELECT
不能用于减少返回的行。在 SQL Server 2008ORDER BY
中只能做结合使用TOP
(对于 2012OFFSET ... FETCH
可以在基础上过滤ORDER
)。ROW_NUMBER
由于您只对表达式的计算结果感兴趣,1
在这种情况下您可以使用SQL小提琴
在评论中讨论了如何扩展它以获得
TOP 2
每个分区。这将是可能的不过,我个人不会使用此答案中的任何一个查询。我只是将查询包装在表表达式中并使用
WHERE
.