GROUP CONCAT 一些不同的一些不是

GROUP CONCAT some distinct some not

我有一个table

company   invest_type  date  round
----------------------------------
A         regular      2011  
A         regular      2011  
A         regular      2012  
A         special      2010  abcd
A         special      2010  abcd

B         regular      2011  
B         regular      2011  
B         regular      2012  
B         special      2010  cdcd
B         special      2010  zzzz

C         regular      2012  
C         regular      2012  
C         special      2010  
C         special      2010  

我想这样显示

company  dates
A        2010,2011,2011,2012
B        2010,2010,2011,2011,2012
C        2010,2012,2012

也就是说,对特殊投资日期进行了重复数据删除(通常是指定的轮次),但常规投资则没有。

我已经尝试过 `GROUP_CONCAT(DISTINCT date,invest_type) 但它并没有接近。 基本上我想从 'date' 中获取不同的日期值,只要回合不是 'null' 在这种情况下我想要重复的值。如果存在轮次,则基于轮次进行重复数据删除,如果不存在,则假设所有特殊投资都是同一轮次并进行重复数据删除。

使用子查询将常规投资中的空轮替换为计数器,以便行将是唯一的,然后使用 SELECT DISTINCT 删除其他所有内容。然后在这上面使用GROUP_CONCAT

SELECT company, GROUP_CONCAT(date ORDER BY date) AS dates
FROM (
    SELECT DISTINCT
               company, date,
               CASE WHEN round IS NOT NULL THEN round
                    WHEN invest_type = 'regular' THEN @counter := @counter + 1
                    ELSE null
               END AS round
    FROM investments
    CROSS JOIN (SELECT @counter := 0) AS var) AS x
GROUP BY company

DEMO

您可以在内联视图中执行重复数据删除,并在外部查询中执行 group_concat(),如下所示:

select
  company,
  group_concat(`date` order by `date` ASC separator ',') as dates
from (
  select distinct company, `date`
  from my_table
  where invest_type = 'special'
  union all
  select company, `date`
  from my_table
  where invest_type != 'special'
) dedup
group by company