具有另一列的两个值的最大版本

Posted

技术标签:

【中文标题】具有另一列的两个值的最大版本【英文标题】:Max version with both values of another Column 【发布时间】:2016-08-24 15:13:53 【问题描述】:

我想展示一个表格的最后一个版本,其中两个值都显示在另一个表格上。

Version | Value
12      | ORANGE
11      | ORANGE
11      | BANANA
10      | ORANGE
11      | BANANA

结果应该是

11      | ORANGE
11      | BANANA

有人可以帮我吗?

【问题讨论】:

是否有任何逻辑可以得到这个结果? 我想要一个显示两行最大版本和两个值的选择。 但是为什么 Orange 是 11 而不是 12? 您的意思是两个值都存在的最大版本?这些值是已知的还是任何值? 这是另一个问题(存在于 11 而不是 12)我必须删除所有其他行,除了带有 BANANA 和 ORANGE 的最大版本。 BANANA 和 ORANGE 是众所周知的价值观 【参考方案1】:

这应该有效

SELECT * 
 FROM TABLE
 WHERE VERSION IN (
    SELECT MIN(VERSION) -- GET MIN VERSION FROM MAX
    FROM (
       SELECT MAX(VERSION) as VERSION, 
       FROM TABLE
       GROUP BY VALUE)
    )
  )

这个技巧会从 Max 版本返回 min 版本,它只有在香蕉和橙色共享确切的版本号时才有效。 这意味着,如果 Orange 跳过了一个版本(从 11 到 13,而没有 12)并且香蕉正好是 12,它将不起作用。

【讨论】:

添加新行时也会失败13 | BANANA 同意,也许我们可以正确地使用@dnoeth 回复,因为他的脚本会找到与 Banana 和 Orange 相同的较低版本。我们还可以通过对不同值元素的新查询来更改 Have 子句,而不仅仅是 2【参考方案2】:

这应该与您的描述相符:

SELECT * FROM tab
WHERE Version IN
 (
   SELECT MAX(Version) OVER ()
   FROM tab
   -- WHERE Value in ('ORANGE','BANANA') ???
   GROUP BY Version
   -- HAVING COUNT(DISTINCT Value) -- if duplicates exist
   HAVING COUNT(*) = 2 -- only versions with two entries
 )

【讨论】:

以上是关于具有另一列的两个值的最大版本的主要内容,如果未能解决你的问题,请参考以下文章

基于另一列的最大值的列上的 SQL 内连接 [重复]

根据另一列的字段值选择具有相同列值的行

如果同一行中另一列中的值匹配,如何比较列的两个值

SQL:根据另一列的值在列上保留一个具有最大值的行

使用公共列映射两个数据框

用于比较具有包含日期​​的单元格的列并将特定文本粘贴到另一列的 Vba 代码