我需要在连接两个字符串值后获得唯一值。以下是我的查询。 字符串连接但重复的值即将到来。我做错了什么?
SELECT ievent.event_type_id evt_type_id,
ievent.event_value evt_value,
ievent.event_date evt_dt,
ievent.company,
ievent.entity_key,
row_number() OVER (ORDER BY ievent.event_date DESC) row_num
FROM (
SELECT we.executive_id,
we.event_type_id,
sum(we.event_value) event_value,
array_to_string(array_agg(DISTINCT (coalesce(mc.aka_co_name,mc.company_name))),',') AS company,
we.event_date,
NULL entity_key
FROM wealth_event we,
master_company mc
WHERE mc.company_id = we.company_id
AND mc.is_active = 'Y'
AND (we.event_value > 1 AND we.event_value < 5000000000 AND we.event_value IS NOT NULL AND we.event_type_id IN (1, 3, 4, 5))
AND we.event_date <= trunc(current_date)
AND we.event_date > trunc(current_date) - 180
GROUP BY we.event_date,
we.executive_id,
we.event_type_id
UNION ALL
SELECT we.executive_id,
we.event_type_id,
sum(we.event_value) event_value,
array_to_string(array_agg(DISTINCT mc.aka_co_name),',') AS company,
we.event_date,
we.entity_key
FROM wealth_event we,
master_company mc
WHERE mc.company_id = we.company_id
AND mc.is_active = 'Y'
AND (we.event_type_id IN (6, 7, 8, 9, 10, 14, 16, 19, 20, 21, 24, 23))
AND we.event_date <= trunc(current_date)
AND we.event_date > trunc(current_date) - 180
GROUP BY we.event_date,
we.executive_id,
we.event_type_id,
we.entity_key
) ievent,
executive exec
WHERE ievent.executive_id = exec.executive_id
AND exec.is_active = 'Y'
AND exec.executive_id = 73685
ORDER BY row_num
答案 0 :(得分:0)
此查询的主要问题是在子查询中使用聚合函数(SUM和array_agg)而没有group by。
也许你需要这样的东西:
SELECT event_type_id , SUM(we.event_value) event_value, evt_dt, NULL entity_key,
array_to_string( DISTINCT ( array_agg ( coalesce(mc.aka_co_name, mc.company_name)) ), ',' ) company
FROM wealth_event we, master_company mc
WHERE mc.company_id = we.company_id
AND mc.is_active='Y'
group by event_type_id , evt_dt
答案 1 :(得分:0)
SELECT ievent.event_type_id evt_type_id,
ievent.event_value evt_value, ievent.event_date evt_dt, ievent.company, ievent.entity_key,
ROW_NUMBER() OVER (ORDER BY IEVENT.EVENT_DATE DESC) ROW_NUM
FROM
(
SELECT
we.executive_id,
we.event_type_id,
SUM(we.event_value) event_value,
string_agg( DISTINCT ( coalesce(mc.aka_co_name, mc.company_name) ), ',' ) as company,
we.event_date, NULL entity_key
FROM
wealth_event we,
master_company mc
WHERE
mc.company_id = we.company_id
AND
mc.is_active='Y'
AND
(we.event_value > 1 AND we.event_value < 5000000000 AND we.event_value IS NOT NULL AND we.event_type_id IN (1,3,4,5))
AND
we.event_date <= ( localtimestamp::date) AND we.event_date > localtimestamp::date - 180
GROUP BY we.event_date, we.executive_id, we.event_type_id
UNION ALL
SELECT
we.executive_id,
we.event_type_id,
SUM(we.event_value) event_value,
string_agg( DISTINCT ( coalesce(mc.aka_co_name, mc.company_name) ), ',' ) company,
we.event_date, we.entity_key
FROM
wealth_event we,
master_company mc
WHERE
mc.company_id = we.company_id
AND
mc.is_active='Y'
AND
(we.event_type_id IN (6,7,8,9,10,14,16,19,20,21,24,23))
AND
we.event_date <= localtimestamp::date AND we.event_date > localtimestamp::date - 180
GROUP BY we.event_date, we.executive_id, we.event_type_id, we.entity_key
) ievent,
EXECUTIVE EXEC
WHERE
ievent.executive_id = EXEC.executive_id
AND
EXEC.is_active = 'Y'
and exec.executive_id = 73685
order by row_num ;