sqlite3中的表比较:两个表在日期中相交,根据列选择旧/交叉数据

时间:2017-10-09 22:40:39

标签: sqlite

我有两个表data_olddata_new,两者都构造成

CREATE TABLE data(
  id TEXT,
  subject TEXT,
  created INT,
  misc1 TEXT,
  misc2 TEXT,
  misc3 TEXT
);

created是在UNIX时间。

填充data_new时,我想比较两者。 data_new使data_old无效并在处理后将其替换,但我的最终目标是确定a)废弃的行数和b)data_old中缺少的行数data_new这两个表在每个subject的个别时间范围内相交。

因此,例如,表格是

data_new                                   data_old
id  subject  created  m1  m2  m3  id  subject  created  m1  m2  m3
sd  dogs     10       a   b   c
hd  cars     12       s   x   f
ht  houses   9        a   l   a   ht  houses   9        a   l   a
up  fruit    7        n   o   r   up  fruit    7        n   o   r
fr  cars     7        x   y   z   fr  cars     7        b   r   a
                                  dw  fruit    3        n   a   d
                                  gf  dogs     2        z   a   b
as  dogs     1        f   i   o   as  dogs     1        a   r   g
                                  xs  fruit    1        u   r   s
                                  ax  cars     0        g   u   b

我的第一个需要是确定在各自的主题中,ID ax,xs和dw已经过时,即使是在dw之前创建的。 (主题是不同的,因此,如果dw"消失了,或者已经过时了,那么它是不确定的。)所以结果应该是:

dw  fruit    3        n   a   d
xs  fruit    1        u   r   s
ax  cars     0        g   u   b

如果我已识别并处理了这些内容,则可以从data_old删除它们,如果这样可以简化过程。

然后,我想确定gf 出现在data_new中,因为subject中的data_new上的旧数据存在于gf dogs 2 z a b 中。在这里,查询的结果应该是

{{1}}

在任何一种情况下,结果的顺序都无关紧要。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不小心偶然发现了答案。有人可以请理智 - 检查一下吗?

$this->input->get();

如果它做了我想做的事情,这简直太简单了,至少对于测试集而言似乎是这样。

来源:https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

答案 1 :(得分:0)

获取所有旧行,其ID不会出现在新表中,并且存在具有相同主题和较小时间戳的新行:

SELECT *
FROM data_old
WHERE id NOT IN (SELECT id FROM data_new)
  AND EXISTS (SELECT *
              FROM data_new
              WHERE data_new.subject = data_old.subject
                AND data_new.created < data_old.created);

对于另一个,用NOT EXISTS替换EXISTS。