在多个字段中选择最高版本

NCS

我有一张这样的桌子:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章