从同一张表中找出两组数据之间的差异

Posted

技术标签:

【中文标题】从同一张表中找出两组数据之间的差异【英文标题】:Finding the difference between two sets of data from the same table 【发布时间】:2012-02-16 09:58:34 【问题描述】:

我的数据如下:

run | line | checksum | group
-----------------------------
 1  |   3  |  123     |  1
 1  |   7  |  123     |  1
 1  |   4  |  123     |  2
 1  |   5  |  124     |  2
 2  |   3  |  123     |  1
 2  |   7  |  123     |  1
 2  |   4  |  124     |  2
 2  |   4  |  124     |  2

我需要一个查询来返回运行 2 中的新条目

run | line | checksum | group
-----------------------------
 2  |   4  |  124     |  2
 2  |   4  |  124     |  2

我尝试了几件事,但我从未得到令人满意的答案。 在这种情况下,我使用的是 H2,但我当然对有助于我理解这个概念的一般解释感兴趣。

编辑: 好的,这是我在这里的第一篇文章,所以如果我没有足够准确地说明问题,请原谅。

基本上给定两个运行值 (r1, r2, with r2 > r1) 我想确定 row = r2 的哪些行与 row = r1 的任何行有不同的行、校验和或组。

【问题讨论】:

问题没有任何意义...... 你如何确定一个条目是新的? 运行 2 中的新条目是什么意思?我看不到数据戳。 【参考方案1】:
select * from yourtable
where run = 2 and checksum = (select max(checksum) 
                              from yourtable)

【讨论】:

【参考方案2】:

假设你上次运行的运行值比其他运行值高,下面的 SQL 会有所帮助

select * from table1 t1
where t1.run in
(select max(t2.run) table1 t2)

更新:

上面的 SQL 可能不会给你正确的行,因为你的要求不是很清楚。但总体思路是根据最新的运行参数获取行。

【讨论】:

【参考方案3】:
SELECT line, checksum, group 
  FROM TableX
  WHERE run = 2 

EXCEPT

SELECT line, checksum, group 
  FROM TableX
  WHERE run = 1 

或(结果略有不同):

SELECT *
  FROM TableX x
  WHERE run = 2
    AND NOT EXISTS
        ( SELECT *
          FROM TableX x2
          WHERE run = 1
            AND x2.line = x.line
            AND x2.checksum = x.checksum
            AND x2.group = x.group 
        )

【讨论】:

【参考方案4】:

稍微不同的方法:

select min(run) run, line, checksum, group
from mytable
where run in (1,2)
group by line, checksum, group
having count(*)=1 and min(run)=2

顺便说一下,我假设表中的“组”列实际上并未称为组 - 这是 SQL 中的保留字,需要用双引号(或反引号或方括号,具体取决于哪个 RDBMS你正在使用)。

【讨论】:

以上是关于从同一张表中找出两组数据之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何查找同一表中两行之间的差异并列出不匹配的记录? mysql在表中查找不匹配的行

SQLite如何计算同一张表的两个变量之间的差异[关闭]

如何计算同一张表中 2 个不同行之间的时间差?

oracle如何比较两个表数据的差异?

如何比较两组数据的差异性?

计算同一张表中SQL中两个时间戳的差值