SQL - 为每个报价ID返回最高版本的记录

时间:2018-06-09 22:33:21

标签: sql sql-server

如果我有一个包含三列的表格,如下所示

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

2 个答案:

答案 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