我有一张这样的桌子:
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
我想做的是编写一个仅选择最后一条记录的查询。一个版本字段仅需使用max函数即可轻松实现,但是如何使用3个版本字段来做到这一点呢?
在这种情况下,“版本1”字段的优先级最高,而“版本3”字段的逻辑最低,逻辑上是“版本2”。例如,当版本1为1时,值2的版本1始终比其aa值为10的版本3优先。
所以在上表中,我要选择以下记录:
value | version1 | version2 | version3
--------|----------|----------|---------
aaa| 3| 2| 2
bbb| 2| 2| 1
ccc| 3| 4| 1
首先查看最高的版本1,然后查看最高的版本2,然后查看最高的版本3。
有人可以告诉我最有效的方法是什么吗?
提前谢谢!
编辑:
查看进一步的解释,您需要按不同的值对输出进行分区。然后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
条件确实具有魔力:仅返回每个不同值的第一行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句