0

在 sqlite 数据库中,我有下表:

id object val1 val2 '时间戳'
1 Z 100 102 53
2 Z 100 102 54
3 Z 100 103 55
4 A 99 123 23
5 A 23 245 35
6 A 23 245 36
7 A 23 245 37
8 A 23 245 38
9 A 99 123 119

对于所有类型的对象,值 val1 和 val2 都记录有时间戳。如何选择包含每个对象的一个​​值字段中的更改的所有行。因此,我想要一个具有以下结果的 select 语句:

id object val1 val2 '时间戳'
1 Z 100 102 53
3 Z 100 103 55
4 A 99 123 23
5 A 23 245 35
9 A 99 123 119

有人可以帮助我正确的 sql 查询。谢谢你。

4

2 回答 2

0

对于具有 objectO和 timestamp的记录T,以下查询将查找相关先前记录的值,即具有最大时间戳但仍小于 的记录T

SELECT val1, val2
FROM MyTable
WHERE object = O
  AND "time stamp" < T
ORDER BY "time stamp" DESC
LIMIT 1

通过使用这样的东西作为子查询,我们可以得到两组值来比较它们:

SELECT *
FROM MyTable AS T1
WHERE val1 || ',' || val2 IS NOT (SELECT T2.val1 || ',' || T2.val2
                                  FROM MyTable AS T2
                                  WHERE T2.object = T1.object
                                    AND T2."time stamp" < T1."time stamp"
                                  ORDER BY T2."time stamp" DESC
                                  LIMIT 1)

从这两个值创建一个字符串可以避免使用两个子查询。
这使用IS NOT而不是因为如果不存在以前<>的记录,子查询将返回。NULL

于 2013-04-23T11:33:42.923 回答
0

编辑:在 OP 进一步阐明了他想要什么之后收回这个。OP 希望收集表示对象状态变化的行。

这将为您提供一组唯一的对象值

      select distinct object, val1, val2

您是否需要一个任意 id 和一个时间戳来与每一行关联以用于特定目的?也就是说,你想要第一次出现吗?最后一次出现?object-value1-value2 三元组的?

如果是这样,您可以分组:

       select object, val1, val2, max(timestamp) as TS from T
       group by object, val1, val2

然后,如果您需要属于具有 max(timestamp) 的三元组的 id,您可以将内联视图加入到四个值的表中。

      select t.id, foo.object, foo.val1, foo.val2, foo.TS 
      from t
      join
      (
       select object, val1, val2, max(timestamp) as TS from T
       group by object, val1, val2
      ) as foo
      on t.object = foo.object and t.val1 = foo.val1 and t.val2 = foo.val2
      and t.timestamp = foo.TS
于 2013-04-23T11:51:29.197 回答