有时候会有通过一个或多个列进行group by
操作,然而想要select
的却是 group by
之外的列(也许并不关心这些列取到什么值)的需求。
一种trick:
SELECT * FROM (
SELECT
*,
row_number () OVER (
partition BY columns
ORDER BY columns
) AS rn
FROM
table
WHERE
conditions
) t
WHERE
rn = 1;
通过子查询实现了类似利用group by分组去重,但依旧提取了group by之外的列的数据的效果。
实际上这用分组排序行号取某条数据的方式适用于所有支持子查询和row_number窗口函数的数据库系统,不只限于Sql Server,只不过有的数据库系统提供了类似任取一个值的语意(比如first()),这种情况下可以不使用子查询。