从同一张表中找出两组数据之间的差异
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你正在使用)。
【讨论】:
以上是关于从同一张表中找出两组数据之间的差异的主要内容,如果未能解决你的问题,请参考以下文章