Java 如何获取id的先前条目
我在postgresql中有一个数据库表,如下所示Java 如何获取id的先前条目,java,database,postgresql,Java,Database,Postgresql,我在postgresql中有一个数据库表,如下所示 entry_no id time ________ ____ ______ 1 1 2017-03-21 00:12:10 2 2 2017-03-21 00:12:18 3 3 2017-03-21 00:12:56 4
entry_no id time
________ ____ ______
1 1 2017-03-21 00:12:10
2 2 2017-03-21 00:12:18
3 3 2017-03-21 00:12:56
4 2 2017-03-21 10:25:34
5 1 2017-03-21 11:09:10
6 2 2017-03-21 11:21:39
7 3 2017-03-21 12:19:19
8 3 2017-03-21 12:29:19
9 1 2017-03-21 12:39:10
10 1 2017-03-21 12:39:10
我有一个Java程序,它必须检测id的前一个条目。例如,如果该条目是id 2
6 2 2017-03-21 11:21:39
从这个条目中,我需要获取相应id的上一个条目,即
4 2 2017-03-21 10:25:34
条目号是一个主键。因此,如果我能找到条目号,它将足够快地找到相应id的前一个条目
由于这个表很大,我不想对整个表进行排序,并按id进行筛选,然后得到以前的id。有什么有效的方法吗
非常感谢您的帮助。我认为最简单的方法是添加另一列
previous\u entry\u no
,该列显然包含前面的条目编号,您可以提取该编号
这种方法的缺点是:您需要一个额外的列,在每次插入之前,您需要执行一个额外的查询,以查找给定
id
的最新条目号,您可以尝试使用Postgres的LAG()
分析函数,并在time
列上使用它。下面的CTE为每条记录分配时间的滞后。然后,我们可以选择您想要其先前值的记录,并且它应该已经存在于结果集中。注意,CTE使用其中id=2
来确保我们仅为该记录块适当地分配滞后时间
WITH cte AS (
SELECT entry_no, id, time,
LAG(time) OVER (ORDER BY time) lag_time
FROM yourTable
WHERE id = 2
)
SELECT *
FROM cte
WHERE entry_no = 6
请按照以下链接进行运行演示:
您选择id为2
的第一条记录的逻辑是什么?这是最近的记录,还是您使用了其他逻辑?实际上数据库表太大了(以十亿计)。因此,添加另一个数据库实际上并不容易column@Ricky,我明白了。然后您可能可以尝试使用比较时间列中的记录。我尝试了您的sql,但它没有响应滞后时间。我不明白为什么它不返回滞后时间_time@Ricky我为你设置了一个Postgres演示。我建议你仔细研究一下,看看你会错在哪里。很抱歉,我在id和条目号上犯了一个错误。谢谢你的帮忙。但正如我所说的,桌子很大,每一张唱片都要花很多时间。无论如何,要让它更快