【问题标题】:How can I display the most recent records with a given key?如何显示具有给定键的最新记录?
【发布时间】: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


    【解决方案1】:

    您需要在 ORDER BY 子句中包含 key(即使最终结果只显示具有该键的一项)包括time以及:

    ORDER BY key, time DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2018-11-21
      • 2021-11-19
      相关资源
      最近更新 更多