仅从给定行中选择ID的最新记录

chr*_*o25 0 sql sql-server

我有这个表如下所示...我如何只根据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语句是我能想到的最接近的语句.如果有人能帮助我,我会很感激.先感谢您 :)

Aar*_*and 7

这通常被称为"每组最大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)

  • 这很奇怪,但我实际上根据你的说法理解了一切.我并不像以前认为的那样愚蠢:) @Aaron Bertrand.非常感谢十亿次:) (2认同)