在组by后生成一个列



是否可以使用生成的列,但要指定它应该在组发生后生成?

我有一系列表,我将它们连接起来并对它们的列求和。这适用于任何未派生(即未生成)的列,但对于生成的列,我需要在分组后取加权平均值,而不是求和。

与其取加权平均值,不如指定生成的列应该在对行进行分组和求和之后发生,这样会更简单。

任何帮助都非常感谢。

抱歉,下面是更多信息的编辑:

生成的列示例如下:

ALTER TABLE example_table ADD COLUMN
example_generated_column DECIMAL(4, 1) 
GENERATED ALWAYS AS (numerator_column / denominator_column * 100) STORED;

如果我要连接多个具有numerator_columndenominator_column的表,我希望在生成新列之前将这些值求和。

这种计算在生成的列定义中不起作用,这实际上可能是一件好事,因为允许它会引发各种混合粒度反模式表。您可以做的,也是在实践中非常常见的,是将计算构建到视图(或物化视图,取决于具体情况)中。这将保留基表的粒度,并且仍然让您获得所需的聚合。

CREATE VIEW schema.table AS
SELECT
A.col1 AS column1_name,
A.col2 AS column2_name,
SUM(A.col3) AS agg_column_name
FROM (
SELECT
x AS col1,
y AS col2,
COUNT(z) AS col3
FROM
some_table
WHERE
x = '2023-04-02'
GROUP BY
x,
y
) A
GROUP BY
A.col1,
A.col2
;

我经常使用这种类型的查询,在内部查询中完成几个UNION ALL操作。它允许这样的模式:

SELECT
A.event_date,
A.some_attribute,
SUM(A.new_transaction_count) AS new_transactions,
SUM(A.old_transaction_count) AS old_transactions
FROM (
SELECT
x AS event_date,
y AS some_attribute,
COUNT(z) AS new_transaction_count,
0 AS old_transaction_count
FROM
new_data_table
WHERE
x = '2023-04-02'
GROUP BY
x,
y
UNION ALL
SELECT
x AS event_date,
y AS some_attribute,
0 new_transaction_count,
COUNT(z) AS old_transaction_count
FROM
old_data_table
WHERE
x = '2023-04-02'
GROUP BY
x,
y
) A
GROUP BY
A.event_date,
A.some_attribute
;

它将给出如下输出:

---------------------------------------------------------------------
| event_date | some_attribute | new_transactions | old_transactions |
---------------------------------------------------------------------
| 2023-04-02 | foobar         | 1000             | 2000             |
---------------------------------------------------------------------

这允许将SUM应用于内部查询中COUNT'的值,并且外部GROUP BY将结果平铺成单行。

最新更新