如何在PostgreSQL函数中使用时间戳进行循环
本文关键字:时间戳 循环 PostgreSQL 函数 | 更新日期: 2023-09-27 18:31:19
我是PostgreSQL的新手,有一个难题,我需要编码到PostgreSQL函数中。
情况是这样的。
在一个表 dx 中,输入的记录包含过帐时间、tposted 和用于长期性的布尔值。
table dx
tposted timestamp
chronic Boolean
现在将有几千条记录。调用 somefunction() 后,我需要返回以按时间顺序显示每条记录 tpost PLUS 返回每条记录,其中 chronic = true 与每个日期比慢性记录的 tpost 更近。
举个例子:
table dx
record tposted chronic
1 01/01/01 False
2 02/02/02 False
3 03/03/03 True <--needs to be carried forward
4 04/04/04 False
5 05/05/05 False
6 06/06/06 True <--needs to be carried forward
7 07/07/07 False
8 08/08/08 False
输出需要重复所有记录,其中 chronic = true:
Output Table
tposted dx.record
01/01/01 1
02/02/02 2
03/03/03 3
04/04/04 3 <-- carried forward
04/04/04 4
05/05/05 3 <--- carried forward
05/05/05 5
06/06/06 3 <--- carried forward
06/06/06 6
07/07/07 3 <--- carried forward
07/07/07 6 <--- carried forward
07/07/07 7
08/08/08 3 <--- carried forward
08/08/08 6 <--- carried forward
08/08/08 8
我的感觉是我需要处理每个日期,一次一个。每个日期返回到标记为 chronic = true 的日期之前的所有记录,返回这些记录,然后继续下一个日期。
这能做到吗?(或者有更好的方法吗?? 感谢您对此的所有帮助。
(我包含一个 C# 标签,因为我不反对在必要时使用 Link 完成此操作)。
我假设'发布日期在表中是唯一的。
在此假设下,以下查询应有效:
select t2.tposted, t1.record,
'<-- carried forward' as comment
from dx t1
join dx t2
on t1.chronic='True' and t1.tposted < t2.tposted
union all
select tposted, record, null
from dx
order by tposted, comment, record
演示:http://sqlfiddle.com/#!15/e6456/17
如果此假设不成立,则需要更改连接条件。
例如,假设record
值是唯一的,并且它们按时间顺序递增,那么您可以尝试在联接中t1.record < t2.record
而不是t1.tposted < t2.tposted
。