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也像包裹)
这通常是不可能的,但在您的问题中的特定情况下。
仅在此处的逻辑查询处理流程图(TheSELECT和ORDER 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)
在评论中讨论如何扩展以获得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.
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |