如果我有一个包含三列的表格,如下所示
CREATE TABLE QUOTATIONS
(
ID INT NOT NULL,
VERSION INT NOT NULL,
PRICE FLOAT NOT NULL
);
除此之外,我们可以说该表包含以下记录:
ID | VERSION | PRICE
----+-----------+--------
1 | 1 | 50
1 | 2 | 40
1 | 3 | 30
2 | 1 | 100
2 | 2 | 80
3 | 1 | 50
是否可以运行任何单个SQL查询并返回仅具有最高版本的所有引用的行?
结果应该如下:
ID | VERSION | PRICE
----+-----------+--------
1 | 3 | 30
2 | 2 | 80
3 | 1 | 50
答案 0 :(得分:3)
我喜欢这种不使用子查询的方法:
select top (1) with ties q.*
from quotations q
order by row_number() over (partition by id order by version desc);
基本上,row_number()
为每个id
的最高版本指定“1”。 top (1) with ties
会返回所有1
。
答案 1 :(得分:0)
SELECT id,version,price
FROM tableName t
JOIN (SELECT id,MAX(version) AS version
FROM tableName
GROUP BY id) AS q1 ON q1.id = t.id AND q1.version = t.version