PostgreSQL - 自我更新串行字段

时间:2014-05-29 09:10:25

标签: postgresql sorting auto-increment

我得到了一个包含3个字段的表格,seq类型为integertstamp类型为timestamptxt类型为text。 例如:

seq | tstamp              | txt
--------------------------------
1   | 2014-01-01 00:00:00 | A
2   | 2014-01-02 00:00:00 | B 
3   | 2014-01-03 00:00:00 | C

我想做什么:

如果插入以下行时间戳 - > 2014-01-02 12:00:00发生,我想根据有序的tstamp

更新我的seq字段

我想要的结果:

seq | tstamp              | txt
--------------------------------
1   | 2014-01-01 00:00:00 | A 
2   | 2014-01-02 00:00:00 | B
3   | 2014-01-02 12:00:00 | A
4   | 2014-01-03 00:00:00 | C

我知道我可以捕获插入触发器并更新tstamp顺序之后的seq字段,但是对于每天进行的百万次插入来说它看起来非常低效。

有更好的方法吗?就像...某种自我更新的串行类型我不知道......

为什么我需要这个?

我需要一个总是更新的序列字段,因为我想知道,如果我只搜索txt字段设置为A的记录,如果有时间"孔"他们之间或他们在无过滤表中顺序关闭

示例:

SELECT * FROM table WHERE txt = 'A';

结果:

seq | tstamp              | txt
--------------------------------
1   | 2014-01-01 00:00:00 | A 
3   | 2014-01-02 12:00:00 | A 

查询的应用程序接收结果只需检查先前seq(current seq != previous seq + 1)的seq以检测"""结果之间。这就是为什么唯一的tstamp还不够

1 个答案:

答案 0 :(得分:3)

您无需数字排序即可实现目标:您可以使用lag()& lead() window functions

select *
from (
  select *,
    not (txt = (lag(txt) over (order by tstamp))) as hole_before,
    not (txt = (lead(txt) over (order by tstamp))) as hole_after
  from t
) t
where txt = 'B';

SQLFiddle

编辑:如果您的数据可以包含多个相等的tstamp值(请注意,默认情况下,时间戳字段的精度没有明确的限制),并且您希望得到一个对它们进行恒定排序,在您的表格中添加serial&在窗口函数中使用order by tstamp, id。如果没有它,对表的查询可能每次都返回不一致,f.ex:

   First query's result could be        Second query's result could be

      2014-01-03 00:00:00 | A             2014-01-03 00:00:00 | B
      2014-01-03 00:00:00 | B             2014-01-03 00:00:00 | A