我有这个表如下所示...我如何只根据changeno选择id的最新数据?
+----+--------------+------------+--------+
| id | data | changeno | |
+----+--------------+------------+--------+
| 1 | Yes | 1 | |
| 2 | Yes | 2 | |
| 2 | Maybe | 3 | |
| 3 | Yes | 4 | |
| 3 | Yes | 5 | |
| 3 | No | 6 | |
| 4 | No | 7 | |
| 5 | Maybe | 8 | |
| 5 | Yes | 9 | |
+----+---------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
我想要这个结果......
+----+--------------+------------+--------+
| id | data | changeno | |
+----+--------------+------------+--------+
| 1 | Yes | 1 | |
| 2 | Maybe | 3 | |
| 3 | No | 6 | |
| 4 | No | 7 | |
| 5 | Yes | 9 | |
+----+---------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
我目前有这个SQL语句......
SELECT id,data,MAX(changeno)as changeno FROM Table1 GROUP BY id;
显然它不会返回我想要的东西.由于aggrerate函数,这应该返回错误.如果我在GROUP BY子句下添加字段,它可以工作,但它不会返回我想要的内容.到目前为止,SQL语句是我能想到的最接近的语句.如果有人能帮助我,我会很感激.先感谢您 :)
这通常被称为"每组最大n"问题.在SQL Server 2005及更高版本中解决此问题的一种方法是使用ROW_NUMBER()基于id列分组计算的CTE ,并按最大值排序changeno:
;WITH cte AS
(
SELECT id, data, changeno,
rn = ROW_NUMBER() OVER (PARTITION BY id ORDER BY changeno DESC)
FROM dbo.Table1
)
SELECT id, data, changeno
FROM cte
WHERE rn = 1
ORDER BY id;
Run Code Online (Sandbox Code Playgroud)