从表中选择多个列,但按一个分组,这始终是唯一的

问题描述 投票:0回答:1
在 UI 中,我有一个表格,其中显示按

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

 始终保持唯一。如果有其他选择可以在不创建视图的情况下实现这一点,我也愿意这样做。

postgresql database-design hasura
1个回答
0
投票
查询视图和运行定义视图的查询之间没有性能差异。事实上,PostgreSQL 在运行查询时用它的定义替换了视图。

您可以在问题末尾使用视图,并向使用该视图的查询添加额外的

GROUP BY

和求和,但这会使视图中的
GROUP BY
毫无意义,实际上会使查询变慢。

我的观点是,在这种情况下使用视图没有任何好处。由于过滤条件需要在

before分组之前应用,您唯一的选择是直接查询shipdata

并在您的应用查询中进行分组和求和。

你对此只字不提,但如果你的部分问题是这个查询的性能太慢,你必须使用不同于视图的工具。在这种情况下,一个选项是使用使用“部分聚合”查询定义的

物化视图,并在您的应用程序查询中进行最终过滤和分组。预聚合物化视图将小于基表,这样查询性能会更好。缺点是如果shipdata

中的数据发生变化,物化视图不会改变,所以你必须定期
REFRESH
它并在两者之间使用稍微陈旧的数据。

© www.soinside.com 2019 - 2024. All rights reserved.