Vertica 聚合函数调用不能嵌套
Vertica aggregate function calls may not be nested
下面是我的查询,当我 运行 它时,我得到了错误
aggregate function calls may not be nested
知道为什么吗?
select
country
, client
, COUNT(DISTINCT msisdn) as 'Total_number_of_MSISDN'
, count(*) as 'Total_number_of_MSISDN'
, count(case when COUNT(DISTINCT msisdn) then 1 end )
from my_table
where CAST(time_updated as DATE) = CURRENT_DATE-1
and action_status='COMPLETED' and "ACTION" ='CHARGE'
GROUP BY
country
, client
ORDER BY
country
, client
以下是我能得到的最接近您期望的结果; 'SG' 和 'A' 的结果,但是,在我的例子中,returns 是 1 而不是 2。
现在,我只是猜测您希望将其计为 2,因为您的输入列表中有两个不同的组 - 排序方式(未)。如果是您要考虑的信息,您需要添加一个序列列,然后使用像 LAG() 或 LEAD() 这样的 OLAP 函数,我认为。
很明显,您提供的示例 table 中的 WHERE 条件完全是无稽之谈。
这是我仅使用您的输入数据所能达到的最接近结果:
WITH
-- input
my_table(country,client,msisdn) AS (
SELECT 'MY','A',111
UNION ALL SELECT 'INDIA','A',112
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'INDIA','A',126
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'INDIA','A',116
UNION ALL SELECT 'INDIA','A',120
UNION ALL SELECT 'CH','D',115
UNION ALL SELECT 'CH','D',115
UNION ALL SELECT 'MY','B',117
UNION ALL SELECT 'INDIA','B',118
UNION ALL SELECT 'SG','C',119
UNION ALL SELECT 'CH','D',199
UNION ALL SELECT 'CH','D',199
)
,
-- rows occurring more than once
dups AS (
SELECT
country
, client
, msisdn
FROM my_table
GROUP BY
country
, client
, msisdn
HAVING COUNT(*) > 1
)
SELECT
m.country
, m.client
, COUNT(DISTINCT m.msisdn) AS 'Number_of_distinct_MSISDN'
, COUNT(*) AS 'Total_number_of_MSISDN'
, COUNT(DISTINCT d.msisdn) AS total_distinct_MSISDN
FROM my_table m
LEFT JOIN dups d USING(country,client,msisdn)
-- where CAST(time_updated as DATE) = CURRENT_DATE-1
-- and action_status='COMPLETED' and "ACTION" ='CHARGE'
GROUP BY
m.country
, m.client
ORDER BY
m.country
, m.client
;
country|client|Number_of_distinct_MSISDN|Total_number_of_MSISDN|total_distinct_MSN
CH |D | 2| 4| 2
INDIA |A | 4| 4| 0
INDIA |B | 1| 1| 0
MY |A | 1| 1| 0
MY |B | 1| 1| 0
SG |A | 1| 4| 1
SG |C | 1| 1| 0
祝你好运 -
马可
下面是我的查询,当我 运行 它时,我得到了错误
aggregate function calls may not be nested
知道为什么吗?
select
country
, client
, COUNT(DISTINCT msisdn) as 'Total_number_of_MSISDN'
, count(*) as 'Total_number_of_MSISDN'
, count(case when COUNT(DISTINCT msisdn) then 1 end )
from my_table
where CAST(time_updated as DATE) = CURRENT_DATE-1
and action_status='COMPLETED' and "ACTION" ='CHARGE'
GROUP BY
country
, client
ORDER BY
country
, client
以下是我能得到的最接近您期望的结果; 'SG' 和 'A' 的结果,但是,在我的例子中,returns 是 1 而不是 2。
现在,我只是猜测您希望将其计为 2,因为您的输入列表中有两个不同的组 - 排序方式(未)。如果是您要考虑的信息,您需要添加一个序列列,然后使用像 LAG() 或 LEAD() 这样的 OLAP 函数,我认为。
很明显,您提供的示例 table 中的 WHERE 条件完全是无稽之谈。
这是我仅使用您的输入数据所能达到的最接近结果:
WITH
-- input
my_table(country,client,msisdn) AS (
SELECT 'MY','A',111
UNION ALL SELECT 'INDIA','A',112
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'INDIA','A',126
UNION ALL SELECT 'SG','A',113
UNION ALL SELECT 'INDIA','A',116
UNION ALL SELECT 'INDIA','A',120
UNION ALL SELECT 'CH','D',115
UNION ALL SELECT 'CH','D',115
UNION ALL SELECT 'MY','B',117
UNION ALL SELECT 'INDIA','B',118
UNION ALL SELECT 'SG','C',119
UNION ALL SELECT 'CH','D',199
UNION ALL SELECT 'CH','D',199
)
,
-- rows occurring more than once
dups AS (
SELECT
country
, client
, msisdn
FROM my_table
GROUP BY
country
, client
, msisdn
HAVING COUNT(*) > 1
)
SELECT
m.country
, m.client
, COUNT(DISTINCT m.msisdn) AS 'Number_of_distinct_MSISDN'
, COUNT(*) AS 'Total_number_of_MSISDN'
, COUNT(DISTINCT d.msisdn) AS total_distinct_MSISDN
FROM my_table m
LEFT JOIN dups d USING(country,client,msisdn)
-- where CAST(time_updated as DATE) = CURRENT_DATE-1
-- and action_status='COMPLETED' and "ACTION" ='CHARGE'
GROUP BY
m.country
, m.client
ORDER BY
m.country
, m.client
;
country|client|Number_of_distinct_MSISDN|Total_number_of_MSISDN|total_distinct_MSN
CH |D | 2| 4| 2
INDIA |A | 4| 4| 0
INDIA |B | 1| 1| 0
MY |A | 1| 1| 0
MY |B | 1| 1| 0
SG |A | 1| 4| 1
SG |C | 1| 1| 0
祝你好运 - 马可