gpt4 book ai didi

sql - 聚合 + last & first -> 丢失顺序

转载 作者:行者123 更新时间:2023-11-29 13:14:29 26 4
gpt4 key购买 nike

我正在尝试在 15 分钟的步长间隔内选择数据。主要分组接缝按预期工作,但我在每 15 分钟组内失去秩序。原因是例如: 对于 time_stamp 在 0-14 分钟范围内的 4 个点 -> “floor(EXTRACT(minute FROM time_stamp)/15) AS quarter”,将返回值“0”(如预期)。因此,然后 ORDER BY "quarter"4 具有 "quarter"== "0"的行,从中选择最后一个值和第一个值。这导致了我无法保证基于时间戳的排序的情况。

SELECT
first(value) as first_value,
last(value) as last_value,
CAST(EXTRACT(year FROM time_stamp) AS INTEGER) AS year,
CAST(EXTRACT(month FROM time_stamp) AS INTEGER) AS month,
CAST(EXTRACT(day FROM time_stamp) AS INTEGER) AS day,
CAST(EXTRACT(hour FROM time_stamp) AS INTEGER) AS hour,
floor(EXTRACT(minute FROM time_stamp) / 15) AS quarter,
FROM
my_table
GROUP BY
year,
month,
day,
hour,
quarter,
ORDER BY
year,
month,
day,
hour,
quarter

下表示例:

CREATE TABLE my_table (
id integer NOT NULL,
time_stamp timestamp without time zone NOT NULL,
value double precision NOT NULL,
);


CREATE SEQUENCE my_table_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;


ALTER TABLE ONLY my_table ALTER COLUMN id SET DEFAULT nextval('my_table_id_seq'::regclass);


ALTER TABLE ONLY my_table
ADD CONSTRAINT my_table_pkey PRIMARY KEY (id);


CREATE INDEX ix_my_table_time_stamp ON my_table USING btree (time_stamp);

我还从查询中删除了“first”和“last”函数,以通知确实缺少排序。

关于如何在每 15 分钟的步骤中保持排序有什么建议吗?

最佳答案

没有标准的聚合函数 first()last(),您可能是指用户定义的聚合函数,例如:

create or replace function first_agg(anyelement, anyelement)
returns anyelement language sql immutable strict
as $$ select $1; $$;

create or replace function last_agg(anyelement, anyelement)
returns anyelement language sql immutable strict
as $$ select $2; $$;

create aggregate first(anyelement) (
sfunc = first_agg,
stype = anyelement
);

create aggregate last(anyelement) (
sfunc = last_agg,
stype = anyelement
);

在聚合中使用order by,参见4.2.7. Aggregate Expressions在文档中。

SELECT
first(value order by time_stamp) as first_value,
last(value order by time_stamp) as last_value,
CAST(EXTRACT(year FROM time_stamp) AS INTEGER) AS year,
CAST(EXTRACT(month FROM time_stamp) AS INTEGER) AS month,
CAST(EXTRACT(day FROM time_stamp) AS INTEGER) AS day,
CAST(EXTRACT(hour FROM time_stamp) AS INTEGER) AS hour,
floor(EXTRACT(minute FROM time_stamp) / 15) AS quarter
FROM
my_table
GROUP BY
year,
month,
day,
hour,
quarter
ORDER BY
year,
month,
day,
hour,
quarter

DbFiddle.

关于sql - 聚合 + last & first -> 丢失顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com