我得到了一个包含3个字段的表格,seq
类型为integer
,tstamp
类型为timestamp
,txt
类型为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 | 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还不够
答案 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';
编辑:如果您的数据可以包含多个相等的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