首页 > 解决方案 > 如何查询实体的时间顺序?

问题描述

我想将实体的时间顺序存储在我的数据库中。

我的桌子看起来像这样:

_id     name     start_time    
  0     Ababab   01.04.2020    
  1     Bababa   02.03.2020    
  2     Cababa   09.04.2020    

我想按 start_time 对实体进行排序,并记住之前按时间顺序发生的实体。像这样:

_id     name     start_time    chronologically_previous
  1     Bababa   02.03.2020    -
  0     Ababab   01.04.2020    1
  2     Cababa   09.04.2020    0

应该可以添加任意新实体,并且 chronologically_previous 应该相应地更新。

到目前为止,我已经尝试过可怕的 SQL 查询......

@Query("UPDATE episode SET previous_cycle_id = 
    (SELECT LEAD(_id) OVER (ORDER BY start_date ASC) FROM episode)")

没用。

它不应该是一个更简单的解决方案吗?也许将订单保存在数组中,另一个对象中,另一个数据库中,我不知道..

我对 Kotlin 和房间以及所有东西都很陌生,所以我很欣赏优雅解决方案的想法!

编辑:

实际上,我最感兴趣的是实体与前一个实体之间的时间差。我也对平均时差感兴趣。

我的应用程序都需要这些时间间隔值。因此,我想以某种方式存储它们,这样我就可以一直避免大量的数据库操作。

解决方案:当我添加一个新实体时,我将 time_gap 字段留空(null)。然后,在下一次运行中,我查询实体的排序列表。在这个列表中,我找到了最近添加的项目的索引。我用列表中“前一个邻居”(索引 - 1)的值更新 time_gap 字段。如果最近的元素不是列表中的最后一个,我也会更新“下一个邻居”(索引 + 1)的 time_gap 字段。

标签: sqlsqliteandroid-room

解决方案


使用lag()

select e.*, 
       lag(_id) over (order by start_time) as prev_id
from episode e;

我不建议将其存储在表中。保持更新以进行数据修改是相当复杂的。


推荐阅读