我有下表。
CREATE TABLE public.ad
(
id integer NOT NULL DEFAULT nextval('ad_id_seq'::regclass),
uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
cmdb_id integer,
platform character varying(100),
bidfloor numeric(15,6),
views integer NOT NULL DEFAULT 1,
year integer,
month integer,
day integer,
CONSTRAINT ad_pkey PRIMARY KEY (id),
CONSTRAINT ad_cmdb_id_foreign FOREIGN KEY (cmdb_id)
REFERENCES public.cmdb (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ad_id_unique UNIQUE (uuid)
)
WITH (
OIDS=FALSE
);
该表格没有详细介绍,可以记录全国各地电子屏幕上广告的所有要求和印象。该表还用于生成报告,包含±5000万条记录。
目前,报告是在created_at时间戳上过滤的。您可以想象,即使在created_at列上有索引,查询也会慢到5000万条。通过选择要在系统UI上请求数据的日期来生成报告。
年,月和日列是我刚刚添加的新列,以提高报告效率。我想让系统在年,月,日上编制所有单独的值,而不是在日期编制索引。
新添加的列仍为空。我想运行一个查询,该查询插入一个值,其中created_at列位于两个日期之间。例如:
INSERT INTO ad (year) VALUES (2016) WHERE created_at BETWEEN '2016-01-01 00:00:00' AND '2016-12-31 23:59:59';
这当然不起作用。我似乎无法在互联网上找到INSERT语句使用WHERE BETWEEN子句的任何内容。我还尝试使用子查询和WITH clausule使用generate_series在2012到2020之间生成一系列年份。这一切都没有成功。
答案 0 :(得分:4)
您不想插入新行,您应该更新您的表格。
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE column_name BETWEEN value1 AND value2;
否则你将有100亿行;)