我有一张这样的桌子:
value | version1 | version2 | version3
--------|----------|----------|---------
aaa| 1| 1| 1
aaa| 1| 1| 2
aaa| 1| 2| 1
aaa| 1| 2| 2
aaa| 3| 1| 1
aaa| 3| 2| 1
aaa| 3| 2| 2
bbb| 1| 1| 1
bbb| 2| 1| 2
bbb| 2| 2| 1
ccc| 2| 1| 2
ccc| 3| 1| 1
ccc| 3| 2| 1
ccc| 3| 4| 1
我想要做的是写一个只选择最后一条记录的查询。使用一个版本字段,只需最大功能即可轻松完成,但如何使用3个版本字段执行此操作?
在这种情况下,"版本1"字段具有最高优先级"版本3"最低的,逻辑性的"版本2"在中间。例如,值为2的version1始终优先于版本3,当版本1为1时,值为10。
所以在上表中,我想选择以下记录:
value | version1 | version2 | version3
--------|----------|----------|---------
aaa| 3| 2| 2
bbb| 2| 2| 1
ccc| 3| 4| 1
首先查看最高版本1,然后是最高版本2,然后是最高版本3.
有人可以告诉我,最有效的方法是什么?
提前thx!答案 0 :(得分:4)
编辑:
查看进一步的解释,您需要按不同的值对输出进行分区。
然后,您可以使用ROW_NUMBER()
函数,将输出限制为每个不同值的一行。
示例:
SELECT
value, version1, version2, version3
FROM (
SELECT
ROW_NUMBER() OVER (
PARTITION BY value
ORDER BY version1 DESC, version2 DESC, version3 DESC
) RN,
value, version1, version2, version3
FROM tableName
) T
WHERE RN = 1
ROW_NUMBER()
函数会给结果集的每一行增加一个数字,
而PARTITION BY
子句将为每组不同的值提供一个独立的行号。
ORDER BY
通过使用声明的第一个值(版本1)对记录进行排序,然后在第一个值完全匹配的情况下跳到第二个值,依此类推......
DESC
关键字表示从较高值到较低值进行排序。
应用最终的WHERE
条件会产生魔力:只返回每个不同值的顶行。
答案 1 :(得分:3)
这可能会对您有所帮助:
select value,version1,version2,version3
from
(
select *,row_number() over(partition by value order by version1 desc, version2 desc, version3 desc) as rn
from yourtable
) as t
where rn = 1
答案 2 :(得分:1)
您可以使用 ROW_NUMBER() 对value
字段上的数据进行分区,并根据需要指定列的排序。使用此方法,您可以按顺序对每个值组的行号进行排序,并且您可以简单地获取每个值的行号= 1的行:
架构设置:
CREATE TABLE Versions
([value] varchar(3), [version1] int, [version2] int, [version3] int)
;
INSERT INTO Versions
([value], [version1], [version2], [version3])
VALUES
('aaa', 1, 1, 1),
('aaa', 1, 1, 2),
('aaa', 1, 2, 1),
('aaa', 1, 2, 2),
('aaa', 3, 1, 1),
('aaa', 3, 2, 1),
('aaa', 3, 2, 2),
('bbb', 1, 1, 1),
('bbb', 2, 1, 2),
('bbb', 2, 2, 1),
('ccc', 2, 1, 2),
('ccc', 3, 1, 1),
('ccc', 3, 2, 1),
('ccc', 3, 4, 1)
;
使用ROW_NUMBER():
查询SELECT *
FROM ( SELECT value ,
version1 ,
version2 ,
version3 ,
ROW_NUMBER() OVER ( PARTITION BY value
ORDER BY version1 DESC,
version2 DESC,
version3 DESC ) AS RowIdentifier
FROM dbo.Versions
) t
WHERE RowIdentifier = 1
<强> Results 强>:
| VALUE | VERSION1 | VERSION2 | VERSION3 | ROWIDENTIFIER |
|-------|----------|----------|----------|---------------|
| aaa | 3 | 2 | 2 | 1 |
| bbb | 2 | 2 | 1 | 1 |
| ccc | 3 | 4 | 1 | 1 |