我有一个带有收集类型的表。我SELECT
要从表和GROUP BY
某些列开始。我希望每个组的结果都包含一个集合,该集合包含该组中所有单个集合的独特联合。
例如,
CREATE OR REPLACE TYPE my_varchar2_list AS TABLE OF VARCHAR2 (80);
WITH test_data (id, a_list) AS
(SELECT 1,
NEW my_varchar2_list ('A', 'B', 'C')
FROM DUAL
UNION ALL
SELECT 1,
NEW my_varchar2_list ('C', 'D', 'E')
FROM DUAL)
SELECT id,
... some magic syntax here...
FROM test_data
GROUP BY id
Desired results:
1, ('A','B','C','D','E')
我只在寻找可以插入上方“神奇的语法在这里”占位符的表达式。我知道我可以通过加入TABLE(a_list)
主表或以其他方式重组查询(或当然使用PL /
SQL)来完成聚合。但是,我现在暂时避免这样的解决方案。
从我的回答改编成另一个问题。
Oracle安装程序 :
CREATE OR REPLACE TYPE VARCHAR2s_Table IS TABLE OF VARCHAR2(100);
/
创建用户定义的聚合类型:
CREATE OR REPLACE TYPE Varchar2sTableUnion AS OBJECT(
list VARCHAR2s_Table,
STATIC FUNCTION ODCIAggregateInitialize(
ctx IN OUT Varchar2sTableUnion
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(
self IN OUT Varchar2sTableUnion,
value IN VARCHAR2s_Table
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(
self IN OUT Varchar2sTableUnion,
returnValue OUT VARCHAR2s_Table,
flags IN NUMBER
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT Varchar2sTableUnion,
ctx IN OUT Varchar2sTableUnion
) RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY Varchar2sTableUnion
IS
STATIC FUNCTION ODCIAggregateInitialize(
ctx IN OUT Varchar2sTableUnion
) RETURN NUMBER
IS
BEGIN
ctx := Varchar2sTableUnion( NULL );
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateIterate(
self IN OUT Varchar2sTableUnion,
value IN VARCHAR2s_Table
) RETURN NUMBER
IS
BEGIN
IF value IS NULL THEN
NULL;
ELSIF self.list IS NULL THEN
self.list := value;
ELSE
self.list := self.list MULTISET UNION DISTINCT value;
END IF;
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateTerminate(
self IN OUT Varchar2sTableUnion,
returnValue OUT VARCHAR2s_Table,
flags IN NUMBER
) RETURN NUMBER
IS
BEGIN
returnValue := self.list;
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT Varchar2sTableUnion,
ctx IN OUT Varchar2sTableUnion
) RETURN NUMBER
IS
BEGIN
IF self.list IS NULL THEN
self.list := ctx.list;
ELSIF ctx.list IS NULL THEN
NULL;
ELSE
self.list := self.list MULTISET UNION DISTINCT ctx.list;
END IF;
RETURN ODCIConst.SUCCESS;
END;
END;
/
创建一个用户定义的聚合函数:
CREATE FUNCTION MULTISET_UNION( list VARCHAR2s_Table )
RETURN VARCHAR2s_Table
PARALLEL_ENABLE AGGREGATE USING Varchar2sTableUnion;
/
查询 :
然后,您可以使用它在查询中执行聚合:
WITH test_data (id, a_list) AS
(SELECT 1,
varchar2s_table ('A', 'B', 'C')
FROM DUAL
UNION ALL
SELECT 1,
varchar2s_table ('C', 'D', 'E')
FROM DUAL)
SELECT id,
MULTISET_UNION( a_list )
FROM test_data
GROUP BY id
输出 :
ID MULTISET_UNION(A_LIST)
-- -------------------------------------------
1 SCHEMA.VARCHAR2S_TABLE('A','B','C','D','E')
第一个名为的文档包含以下文档(不包括): 第二个集合名为,具有以下文档: 上的 预期的结果是: 如何使用聚合查询来实现这一点?
我想将一列聚合为一组值。 让我们考虑以下模式 我需要这样的结果 我试着搜索一个集合聚合函数,但找不到任何有用的东西。
我知道重载是在编译时决定的,但当我试图运行下面的示例时,它给出了我无法理解的结果 当我每次运行这个代码片段时,我都会得到“Collection”的输出,这意味着调用参数为Collection的classify方法。 请解释
我正在使用面临的问题是,当我运行下面的代码时,我得到了。 据我所知,代码应该毫无例外地终止。 有人能帮我理解为什么我会得到这个例外吗。
我有以下方案的数据: 我想从这些数据中计算出几个聚合字段,并具有以下模式: 在RDD的快乐日子里,我可以使用,定义{ip-的映射 在Dataset/Dataframe聚合中不再可用,而是可以使用UDAF,不幸的是,从我使用UDAF的经验来看,它们是不可变的,这意味着它们不能使用(必须在每次映射更新时创建一个新实例)示例解释在这里 一方面,从技术上讲,我可以将数据集转换为RDD、聚合等,然后返回数据
集群监控的本质是一个聚合功能。 单台机器的监控指标难以反应整个集群的情况,我们需要把整个集群的机器(体现为某个HostGroup下的机器)综合起来看。比如所有机器的qps加和才是整个集群的qps,所有机器的request_fail数量 ÷ 所有机器的request_total数量=整个集群的请求失败率。 我们计算出集群的某个整体指标之后,也会有“查看该指标的历史趋势图” “为该指标配置报警” 这种