【发布时间】:2023-01-07 09:28:23
【问题描述】:
我想创建一个物化视图,它只显示另一个表中具有给定键的最新记录。
为了使这一点具体化,请使用下表和数据:
DROP MATERIALIZED VIEW IF EXISTS "public"."current_data_view";
DROP TABLE IF EXISTS "public"."immutable_data";
DROP SEQUENCE IF EXISTS "public"."immutable_data";
CREATE SEQUENCE IF NOT EXISTS immutable_data_id_seq;
-- Table Definition
CREATE TABLE "public"."immutable_data" (
"id" int4 NOT NULL DEFAULT nextval('immutable_data_id_seq'::regclass),
"uuid" UUID NOT NULL DEFAULT gen_random_uuid(),
"time" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
"key" varchar NOT NULL,
"name" varchar,
"rank" varchar,
"serial_number" varchar,
PRIMARY KEY ("id")
);
INSERT INTO immutable_data("key", "name", "rank", "serial_number")
VALUES ('joe', 'Joe Blow', 'Private', '1234-567-890');
INSERT INTO immutable_data("key", "name", "rank", "serial_number")
VALUES ('joe', 'Joseph Blow', 'Corporal', '1234-567-890');
我想要一个只显示键为“joe”的最后一条记录的视图。
如果我尝试这样做,Postgres 会抱怨 (SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON (key) *):
CREATE MATERIALIZED VIEW current_data_view
AS
SELECT DISTINCT ON (key) *
FROM immutable_data
ORDER BY time ASC;
WITH DATA;
但是以下(或我尝试过的 Postgres 接受的任何其他内容)是无用的:
CREATE MATERIALIZED VIEW current_data_view
AS
SELECT DISTINCT ON (time) *
FROM immutable_data
ORDER BY time ASC;
WITH DATA;
【问题讨论】:
标签: sql postgresql