Postgresql动态递归计数记录

时间:2017-10-24 09:37:03

标签: sql database postgresql recursion

我正在尝试从事件记录表中计算记录,这些事件记录在事件时间之间具有接近的时间间隔,并且为其他列共享相同的条件以检测每个扑动事件的第一次出现事件时间和最后停止时间

我正在使用Postgres数据库,尽管可以使用with recursive完成,所以我编写了以下代码:

with recursive flapping as (
    select nodeid, problemtext,moid,eventtime,1 as count from sb.fm_power_alarms a where nodeid = 'DSA1738'

    union 
    select nodeid,problemtext,moid,f.eventtime,f.count+1
    from flapping f
    where nodeid=f.nodeid and moid=f.moid and problemtext=f.problemtext
    and eventtime-f.eventtime<'00:10:00'::interval and eventtime <>f.eventtime
)
select nodeid,problemtext,moid,eventtime, sum(count) from flapping
group by nodeid,problemtext,moid,eventtime order by eventtime desc

它没有正确计数,也没有按照间隔标准工作

nodeid  problemtext moid    eventtime   sum
DSA1738 Major_Alarm DSA1738 10/24/2017 10:50    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:39    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:35    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:32    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:23    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:17    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:16    1
DSA1738 Major_Alarm DSA1738 10/24/2017 10:15    1

这是表格的DDL:

CREATE TABLE sb.fm_power_alarms
(
  alarmid text NOT NULL,
  problemtext text,
  eventtime timestamp(0) without time zone,
  ceasetime timestamp(0) without time zone,
  nodeid text,
  moid text, -- TG / Cell id

  CONSTRAINT poweralarm_pk PRIMARY KEY (alarmid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sb.fm_power_alarms
  OWNER TO postgres;

这是一些填充测试数据的插入语句

INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355236275', 'Major_Alarm',  '2017-10-23 18:21:59', '2017-10-23 18:27:38', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355236007', 'Major_Alarm',  '2017-10-23 18:19:25', '2017-10-23 18:21:28', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355237001', 'Major_Alarm',  '2017-10-23 18:28:08', '2017-10-23 18:31:13', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355237697', 'Major_Alarm',  '2017-10-23 18:31:44', '2017-10-23 18:32:45', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355068807', 'Major_Alarm',  '2017-10-23 07:17:30', '2017-10-23 07:18:32', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355068318', 'Major_Alarm',  '2017-10-23 07:10:20', '2017-10-23 07:10:50', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355068672', 'Major_Alarm',  '2017-10-23 07:15:58', '2017-10-23 07:17:00', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355068412', 'Major_Alarm',  '2017-10-23 07:11:21', '2017-10-23 07:15:28', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355237858', 'Major_Alarm',  '2017-10-23 18:33:47', '2017-10-23 18:52:45', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355063572', 'Major_Alarm',  '2017-10-23 05:54:58', '2017-10-23 05:55:28', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355063420', 'Major_Alarm',  '2017-10-23 05:51:54', '2017-10-23 05:53:56', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355063762', 'Major_Alarm',  '2017-10-23 05:58:02', '2017-10-23 05:59:34', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355427976', 'Major_Alarm',  '2017-10-24 10:50:00', NULL, 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355045543', 'Major_Alarm',  '2017-10-23 04:55:29', '2017-10-23 04:57:32', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355044468', 'Major_Alarm',  '2017-10-23 04:50:52', '2017-10-23 04:51:54', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355045210', 'Major_Alarm',  '2017-10-23 04:53:56', '2017-10-23 04:54:27', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355379387', 'Major_Alarm',  '2017-10-24 09:41:18', '2017-10-24 09:48:30', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355019561', 'Major_Alarm',  '2017-10-23 03:58:35', '2017-10-23 03:59:35', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355019110', 'Major_Alarm',  '2017-10-23 03:54:59', '2017-10-23 03:55:29', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355351597', 'Major_Alarm',  '2017-10-24 08:51:04', '2017-10-24 08:57:43', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355018573', 'Major_Alarm',  '2017-10-23 03:53:26', '2017-10-23 03:54:29', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355019461', 'Major_Alarm',  '2017-10-23 03:57:02', '2017-10-23 03:57:32', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1355019140', 'Major_Alarm',  '2017-10-23 03:56:01', '2017-10-23 03:56:31', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1354985670', 'Major_Alarm',  '2017-10-22 23:57:35', '2017-10-22 23:58:37', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1354985044', 'Major_Alarm',  '2017-10-22 23:49:23', '2017-10-22 23:50:24', 'DSA1738',  'DSA1738');
INSERT INTO fm_power_alarms (alarmid, problemtext,  eventtime, ceasetime, nodeid,  moid) VALUES ('1354985502', 'Major_Alarm',  '2017-10-22 23:55:01', '2017-10-22 23:57:05', 'DSA1738',  'DSA1738');

我需要输出看起来像这样记录记录之间的区别&#39;活动时间

nodeid, moid, first_eventtime, last_ceasetime, number_of_records

我花了很多时间试图让它发挥作用并找到一种方法来包含停止时间标准。我可以使用我能得到的所有帮助。

0 个答案:

没有答案