shipday
分组的数据,这是一周中的几天。为此,我创建了一个 PostgreSQL 视图 -
CREATE
OR REPLACE VIEW "public"."view_shipday" AS
SELECT
shipdata.shipday,
count(*) AS count,
sum(shipdata.delivered) AS delivered,
sum(shipdata.transit) AS transit,
sum(shipdata.refused) AS refused,
sum(shipdata.undeliverable) AS undeliverable,
sum((shipdata.undeliverable + shipdata.refused)) AS total_exceptions
FROM
shipdata
GROUP BY
shipdata.shipday;
现在在 UI 上,我有两个过滤器 carrier
和
shipdate
当用户选择像
shipdate
或
carrier
或两者我想用
shipdate
按选定的过滤器分组数据但我想要
shipday
永远独一无二(这很重要)。我试过创建下面的视图,但这会创建重复的
shipday
.
CREATE
OR REPLACE VIEW "public"."view_shipday_and_filter" AS
SELECT
shipdata.shipday,
date(shipdata.shipdate),
shipdata.carrier,
count(*) AS count,
sum(shipdata.delivered) AS delivered,
sum(shipdata.transit) AS transit,
sum(shipdata.refused) AS refused,
sum(shipdata.undeliverable) AS undeliverable,
sum((shipdata.undeliverable + shipdata.refused)) AS total_exceptions
FROM
shipdata
GROUP BY
shipdata.shipday,
date(shipdata.shipdate),
shipdata.carrier;
我不想在客户端进行分组,因为数据量真的很大,它会减慢应用程序的速度。因此,在数据库中,我想创建一个或多个(如果需要)视图,这些视图将对上述情况的数据处理进行分组,以便 shipday
始终保持唯一。如果有其他选择可以在不创建视图的情况下实现这一点,我也愿意这样做。
您可以在问题末尾使用视图,并向使用该视图的查询添加额外的
GROUP BY
和求和,但这会使视图中的
GROUP BY
毫无意义,实际上会使查询变慢。我的观点是,在这种情况下使用视图没有任何好处。由于过滤条件需要在
before分组之前应用,您唯一的选择是直接查询shipdata
并在您的应用查询中进行分组和求和。你对此只字不提,但如果你的部分问题是这个查询的性能太慢,你必须使用不同于视图的工具。在这种情况下,一个选项是使用使用“部分聚合”查询定义的
物化视图,并在您的应用程序查询中进行最终过滤和分组。预聚合物化视图将小于基表,这样查询性能会更好。缺点是如果shipdata
中的数据发生变化,物化视图不会改变,所以你必须定期
REFRESH
它并在两者之间使用稍微陈旧的数据。