删除postgres中的重复日期

时间:2016-04-19 05:35:18

标签: sql postgresql

我需要在连接两个字符串值后获得唯一值。以下是我的查询。 字符串连接但重复的值即将到来。我做错了什么?

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

2 个答案:

答案 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 ;