如何在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 完成此操作)。

如何在PostgreSQL函数中使用时间戳进行循环

我假设'发布日期在表中是唯一的。
在此假设下,以下查询应有效:

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