Postgresql 对所有时间流逝求和,其中timetype='Break',但仅对timetype='Start'之后的行求和

Postgresql 对所有时间流逝求和,其中timetype='Break',但仅对timetype='Start'之后的行求和,postgresql,function,sum,Postgresql,Function,Sum,大家好,这是我的桌子 这是用于创建相同表的SQL语句 CREATE TABLE tbl_ebscbspa_log05 ( pcnum smallint NOT NULL, fnserial serial NOT NULL, fnname character varying NOT NULL, timestmp timestamp without time zone DEFAULT clock_timestamp(), timeelapse interval, timety

大家好,这是我的桌子

这是用于创建相同表的SQL语句

CREATE TABLE tbl_ebscbspa_log05
(
  pcnum smallint NOT NULL,
  fnserial serial NOT NULL,
  fnname character varying NOT NULL,
  timestmp timestamp without time zone DEFAULT clock_timestamp(),
  timeelapse interval,
  timetype character varying,
  timeindex real,
  CONSTRAINT table_ebscb_spa_log05_pkey PRIMARY KEY (fnserial)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE tbl_ebscbspa_log05
  OWNER TO postgres;
如果时间类型为'Break',并且位于最后一个子代时间类型为'Start'的后面,我如何计算所有时间流逝的总和?因此,在上面的表格中,我将得到两个蓝色方形行的总和。所以我得到了'totalbreak'=00-00-00 02:00:00.000

在最后一个子代“Start”之后选择所有可能的“break”并将其汇总的语法是什么?假设最大可能的“中断”为9次

我试过这个,结果是空的

SELECT t.timeelapse FROM tbl_ebscbspa_log05 t WHERE t.timetype = 'Break' AND NOT EXISTS (SELECT 1 FROM tbl_ebscbspa_log05 WHERE timetype = 'Start' AND 'timestmp' > 't.timestmp') INTO v_timeelapse_break;
        IF FOUND THEN
          NEW.timeelapse := v_timeelapse_break;
请我想知道如何总结它们,而不仅仅是选择它们,希望一些优秀的PostgreSQL程序员同事能帮我一把


高级谢谢。

Hi@kordirko,谢谢,它成功了,虽然我担心性能,但我读到MAX可能跑得很慢,这。。。从tbl_ebscbspa_log05中选择t.TimePasse,其中t.timetype='Break'且不存在从tbl_ebscbspa_log05中选择1,其中timetype='Start'和'timestmp'>'t.timestmp'。。。会运行得更快,插入量非常大,但我无法让它工作,知道吗?谢谢。我想错误就在这里:…'timestmp'>'t.timestmp'。。。。您正在使用字符串文本“timestamp”和“t.timestmp”而不是列名=>just….timestmp>t.timestmp。。。没有无性生殖。当某物包含在无介词中时,它被简单地视为字符串文字:字符串,而不是列名。出于好奇-你从哪里读到MAX跑得很慢?当适当的索引到位后,它就会运行得非常快-对于来自我的naswer的查询,在tbl_ebscbspa_log05 timetype上创建一个索引,fnserial和MAX将在几毫秒内运行。不,我没有任何索引。如果我的fnserial列有9000行,选择MAXfnserial意味着它将检查所有9000行,看看哪个更高??关于。。。从timetype='Break'的表格中选择SUMTIMELASE,并从timetype='Start'的表格中选择fnserial>按fnserial DESC LIMIT 1排序。。。不是更快吗?它会检查所有9000行吗?
SELECT sum(timeelapse)
FROM tbl_ebscbspa_log05
WHERE timetype = 'Break'
  AND fnserial > 
    /* Get serial of last record with timetyoe 'Start' */
   ( SELECT max( fnserial )
      FROM tbl_ebscbspa_log05
      WHERE timetype = 'Start'
    )