我在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 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
条目no是主键。如果我能找到entry_no,它将足够快地找到相应id的前一个条目。
由于表格很大,我不想对整个表格进行排序并按ID过滤,然后获取之前的ID。是否有任何有效的方法?
感谢任何帮助。
答案 0 :(得分:2)
您可以尝试使用Postgres的LAG()
分析函数,并在time
列上使用它。下面的CTE为每条记录分配time
的滞后。然后,我们可以选择您想要的先前值的记录,它应该已经存在于结果集中。请注意,CTE使用WHERE 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
按照以下链接进行正在运行的演示:
答案 1 :(得分:1)
我认为添加另一列previous_entry_no
的最简单方法是明确包含先前的条目编号,并且可以提取。
此方法的缺点:您需要一个额外的列,在每次插入之前,您需要执行其他查询以查找给定entry_no
的最新id
。