Fix AVG computation in overview tables
Fixes #232 Averages of averages are not equal to overall averages.
This commit is contained in:
@@ -529,6 +529,9 @@ AS $$
|
|||||||
DECLARE
|
DECLARE
|
||||||
column_type TEXT;
|
column_type TEXT;
|
||||||
qualified_column TEXT;
|
qualified_column TEXT;
|
||||||
|
has_counter_column BOOLEAN;
|
||||||
|
feature_count TEXT;
|
||||||
|
total_feature_count TEXT;
|
||||||
BEGIN
|
BEGIN
|
||||||
IF table_alias <> '' THEN
|
IF table_alias <> '' THEN
|
||||||
qualified_column := Format('%I.%I', table_alias, column_name);
|
qualified_column := Format('%I.%I', table_alias, column_name);
|
||||||
@@ -538,12 +541,23 @@ BEGIN
|
|||||||
|
|
||||||
column_type := CDB_ColumnType(reloid, column_name);
|
column_type := CDB_ColumnType(reloid, column_name);
|
||||||
|
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT * FROM CDB_ColumnNames(reloid) as colname WHERE colname = '_feature_count'
|
||||||
|
) INTO has_counter_column;
|
||||||
|
IF has_counter_column THEN
|
||||||
|
feature_count := '_feature_count';
|
||||||
|
total_feature_count := 'SUM(_feature_count)';
|
||||||
|
ELSE
|
||||||
|
feature_count := '1';
|
||||||
|
total_feature_count := 'count(*)';
|
||||||
|
END IF;
|
||||||
|
|
||||||
CASE column_type
|
CASE column_type
|
||||||
WHEN 'double precision', 'real', 'integer', 'bigint', 'numeric' THEN
|
WHEN 'double precision', 'real', 'integer', 'bigint', 'numeric' THEN
|
||||||
IF column_name = '_feature_count' THEN
|
IF column_name = '_feature_count' THEN
|
||||||
RETURN 'SUM(_feature_count)';
|
RETURN 'SUM(_feature_count)';
|
||||||
ELSE
|
ELSE
|
||||||
RETURN Format('AVG(%s)::' || column_type, qualified_column);
|
RETURN Format('SUM(%s*%s)/%s::' || column_type, qualified_column, feature_count, total_feature_count);
|
||||||
END IF;
|
END IF;
|
||||||
WHEN 'text' THEN
|
WHEN 'text' THEN
|
||||||
-- TODO: we could define a new aggregate function that returns distinct
|
-- TODO: we could define a new aggregate function that returns distinct
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ SELECT 1114
|
|||||||
{_vovw_2_base_bare_t,_vovw_1_base_bare_t,_vovw_0_base_bare_t}
|
{_vovw_2_base_bare_t,_vovw_1_base_bare_t,_vovw_0_base_bare_t}
|
||||||
126
|
126
|
||||||
number,int_number,name,start
|
number,int_number,name,start
|
||||||
AVG(number)::double precision AS number,AVG(int_number)::integer AS int_number,CASE count(*) WHEN 1 THEN MIN(name) ELSE NULL END::text AS name,CASE count(*) WHEN 1 THEN MIN(start) ELSE NULL END::date AS start
|
SUM(number*1)/count(*)::double precision AS number,SUM(int_number*1)/count(*)::integer AS int_number,CASE count(*) WHEN 1 THEN MIN(name) ELSE NULL END::text AS name,CASE count(*) WHEN 1 THEN MIN(start) ELSE NULL END::date AS start
|
||||||
AVG(tab.number)::double precision AS number,AVG(tab.int_number)::integer AS int_number,CASE count(*) WHEN 1 THEN MIN(tab.name) ELSE NULL END::text AS name,CASE count(*) WHEN 1 THEN MIN(tab.start) ELSE NULL END::date AS start
|
SUM(tab.number*1)/count(*)::double precision AS number,SUM(tab.int_number*1)/count(*)::integer AS int_number,CASE count(*) WHEN 1 THEN MIN(tab.name) ELSE NULL END::text AS name,CASE count(*) WHEN 1 THEN MIN(tab.start) ELSE NULL END::date AS start
|
||||||
{_vovw_2_base_t,_vovw_1_base_t,_vovw_0_base_t}
|
{_vovw_2_base_t,_vovw_1_base_t,_vovw_0_base_t}
|
||||||
126
|
126
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user