如何避免 - 用户定义的聚合不能与其他不同的聚合一起在查询中使用

发布于 2025-01-14 09:42:10 字数 2816 浏览 1 评论 0原文

我有错误

[0A000][5366] [Vertica]VJDBC 错误:用户定义的聚合无法在与其他不同聚合的查询中使用

[0A000][5366] [Vertica]VJDBC 错误:当我执行时,

SELECT LISTAGG(DISTINCT a USING PARAMETERS separator=',', max_length = 10) AS a,
       COUNT(DISTINCT b)                                                   AS b
FROM t

我是否有办法避免此聚合并具有相同的逻辑?

在实际项目中,我有一个复杂的查询,其中包含许多“子选择”和“with as”、“group by”逻辑,所以我想知道如何重构,我有多少种方式?

我阅读了链接,但不知道如何组合 COUNT DISTINCT 和 LISTAGG DISTINCT: https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Aggregate/COUNTAggregate.htm https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Aggregate/LISTAGG.htm" vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Aggregate/LISTAGG.htm

DB:Vertica 分析数据库 v10.1.1-3

UDP:@Kendle 帮助下的解决方案

(WITH zz as (SELECT a, b FROM mkt_dwh.t) -- "where", "group by" logic
 SELECT a, b
 FROM (WITH aa AS (SELECT DISTINCT a FROM zz),
            bb AS (SELECT COUNT(b) as b FROM zz)
       SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
              bb.b                                                                     AS b
       FROM aa,
            bb
       GROUP BY bb.b) as test);
CREATE TABLE t
(
    a VARCHAR,
    b VARCHAR
);


INSERT INTO mkt_dwh.t
VALUES ('1', '1');
INSERT INTO mkt_dwh.t
VALUES ('1', '1');
INSERT INTO mkt_dwh.t
VALUES ('2', '2');
INSERT INTO mkt_dwh.t
VALUES ('2', '3');
INSERT INTO mkt_dwh.t
VALUES ('3', '3');

SELECT LISTAGG(a USING PARAMETERS separator=',', max_length = 1000) AS a,
       COUNT(distinct b)                                            AS b
FROM mkt_dwh.t;
select count(*)
FROM mkt_dwh.t;

SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
       COUNT(bb.b)                                                              AS b
FROM (SELECT DISTINCT a FROM mkt_dwh.t) aa,
     (SELECT DISTINCT b FROM mkt_dwh.t) bb;

(WITH zz as (SELECT a, b FROM mkt_dwh.t) -- some where, group by logic
 SELECT a, b
 FROM (WITH aa AS (SELECT DISTINCT a FROM zz),
            bb AS (SELECT COUNT(b) as b FROM zz)
       SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
              bb.b                                                                     AS b
       FROM aa,
            bb
       GROUP BY bb.b) as test);

I have error

[0A000][5366] [Vertica]VJDBC ERROR: User defined aggregate cannot be used in query with other distinct aggregates

when I execute

SELECT LISTAGG(DISTINCT a USING PARAMETERS separator=',', max_length = 10) AS a,
       COUNT(DISTINCT b)                                                   AS b
FROM t

Do I have a way to avoid this aggregation and have the same logic?

In real project I have a complex query with many "subselect" and "with as", "group by" logic, so I wonder how it is possible to refactor, how many way I have?

I read the links, but no ideas how combine COUNT DISTINCT and LISTAGG DISTINCT: https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Aggregate/COUNTAggregate.htm
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Aggregate/LISTAGG.htm

DB: Vertica Analytic Database v10.1.1-3

UDP: solution with the help of @Kendle

(WITH zz as (SELECT a, b FROM mkt_dwh.t) -- "where", "group by" logic
 SELECT a, b
 FROM (WITH aa AS (SELECT DISTINCT a FROM zz),
            bb AS (SELECT COUNT(b) as b FROM zz)
       SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
              bb.b                                                                     AS b
       FROM aa,
            bb
       GROUP BY bb.b) as test);
CREATE TABLE t
(
    a VARCHAR,
    b VARCHAR
);


INSERT INTO mkt_dwh.t
VALUES ('1', '1');
INSERT INTO mkt_dwh.t
VALUES ('1', '1');
INSERT INTO mkt_dwh.t
VALUES ('2', '2');
INSERT INTO mkt_dwh.t
VALUES ('2', '3');
INSERT INTO mkt_dwh.t
VALUES ('3', '3');

SELECT LISTAGG(a USING PARAMETERS separator=',', max_length = 1000) AS a,
       COUNT(distinct b)                                            AS b
FROM mkt_dwh.t;
select count(*)
FROM mkt_dwh.t;

SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
       COUNT(bb.b)                                                              AS b
FROM (SELECT DISTINCT a FROM mkt_dwh.t) aa,
     (SELECT DISTINCT b FROM mkt_dwh.t) bb;

(WITH zz as (SELECT a, b FROM mkt_dwh.t) -- some where, group by logic
 SELECT a, b
 FROM (WITH aa AS (SELECT DISTINCT a FROM zz),
            bb AS (SELECT COUNT(b) as b FROM zz)
       SELECT LISTAGG(distinct aa.a USING PARAMETERS separator=',', max_length = 1000) AS a,
              bb.b                                                                     AS b
       FROM aa,
            bb
       GROUP BY bb.b) as test);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2025-01-21 09:42:10

您可以使用子查询来进行区分。

SELECT LISTAGG(aa.a USING PARAMETERS separator=',', max_length = 10) AS a,
       COUNT(bb.b)                                                   AS b
FROM 
  (SELECT DISTINCT a FROM t) aa,
  (SELECT DISTINCT b FROM t) bb;

You could use sub-queries to do the distinct.

SELECT LISTAGG(aa.a USING PARAMETERS separator=',', max_length = 10) AS a,
       COUNT(bb.b)                                                   AS b
FROM 
  (SELECT DISTINCT a FROM t) aa,
  (SELECT DISTINCT b FROM t) bb;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文