Postgresql 对所有时间流逝求和,其中timetype='Break',但仅对timetype='Start'之后的行求和
大家好,这是我的桌子 这是用于创建相同表的SQL语句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
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'
)