Как удалить дубликаты записей из MySql 5.5.Производная таблица, которая агрегирует данные по дате - PullRequest
0 голосов
/ 21 октября 2018

В следующей таблице с именем hb_lead хранится уникальный запрос, код и отметка времени.Давайте назовем события, записанные здесь reg

 id_hb_lead | lead_code | creation_date
 -----------|-----------|--------------
  1         | ABC       | 2018-10-01
  2         | DEF       | 2018-10-02
  3         | GHI       | 2018-10-02
  4         | CYZ       | 2018-10-03
  5         | HIJ       | 2018-10-10

В таблице hb_lead_engagement хранится много раз, когда каждое лидерство взаимодействует с некоторыми вещами.Давайте назовем здесь зарегистрированные события enga

 id_hb_lead_engagement | id_b_lead |  id_event | event_date
 ----------------------|-----------|-----------|----------- 
  1                    | 1         |       12  | 2018-10-02
  2                    | 2         |       12  | 2018-10-03
  3                    | 3         |       12  | 2018-10-03
  4                    | 4         |       12  | 2018-10-06
  5                    | 3         |       12  | 2018-10-08
  6                    | 5         |       12  | 2018-10-16
  7                    | 2         |       12  | 2018-10-19
  8                    | 3         |       12  | 2018-10-10
  9                    | 5         |       12  | 2018-10-10

Мне нужно сгенерировать таблицу, подобную этой, где для каждой и уникальной даты, reg и enga события подсчитываются.Пожалуйста, не волнует 0 или ноль , я могу COALESCE с 0 или ноль ...

 date      |  reg     | enga
-----------|----------|-----------
2018-10-01 |    1     |    
2018-10-02 |    2     |    1
2018-10-03 |    1     |    2
2018-10-06 |          |    1 
2018-10-08 |          |    1
2018-10-10 |    1     |    2
2018-10-16 |          |    1
2018-10-19 |          |    1

Использование Производная таблица какие первые UNION две таблицы для перечисления всех дат событий, а затем COUNT событий, я создал такую ​​таблицу, которая не может дублировать даты, когда совпадают даты и reg и enga события больше, чем 1.

 date      |  regs          | engas
-----------|----------------|-----------
2018-10-01 |    1           |    
2018-10-02 |    2           |    
2018-10-02 |                |    1
2018-10-03 |    1           |    
2018-10-03 |                |    2
2018-10-06 |                |    1 
2018-10-08 |                |    1
2018-10-10 |    1           |     
2018-10-10 |                |    2
2018-10-16 |                |    1
2018-10-19 |                |    1

Так что я знаю, что способ решить эту проблему, скажем, агрегированные данные для каждой строки, это JOIN две таблицы в основном LEFT JOIN и затем используйте CASE .Однако из-за того, что это производная таблица, она может быть СОЕДИНЕНА сама с собой, поэтому мой вопрос заключается в том, как объединить полученную производную таблицу, зная, что производные таблицы не могут быть объединены с самим собой.

Если вам интересно, как я получил дату, вот мой запрос:

select *
from
(
  select   date_format(l.fecha_creacion, '%Y-%m-%d') as categoria, 
  count(*) as reg, '' as enga
  from hb.hb_lead l    
  group by  categoria

union 

 select  date_format(le.le_fecha_creacion, '%Y-%m-%d') fecha, '', 
 count(*) 
 from hb.hb_lead_engagement le
 where le.id_hb_evento = 12
 group by   fecha
 order by 1
) t1

Я ограничен версией MySql: 5.5.5-10.1.36-MariaDB, поэтому ** с a как **вне обсуждения.Спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

Вы можете попробовать UNION столбец даты, затем использовать outer join базу на нем.

**Schema (MySQL v5.5)**

create table hb_lead (
   id_hb_lead int,
   lead_code varchar(50),
   creation_date date
); 



insert into hb_lead values (1,'ABC', '2018-10-01');
insert into hb_lead values (2,'DEF', '2018-10-02');
insert into hb_lead values (3,'GHI', '2018-10-02');
insert into hb_lead values (4,'CYZ', '2018-10-03');
insert into hb_lead values (5,'HIJ', '2018-10-10');


create table hb_lead_engagement (
   id_hb_lead_engagement int,
   id_b_lead int,
   id_event int,
  event_date date
);



insert into hb_lead_engagement values (1,1,12, '2018-10-02');
insert into hb_lead_engagement values (2,2,12, '2018-10-03');
insert into hb_lead_engagement values (3,3,12, '2018-10-03');
insert into hb_lead_engagement values (4,4,12, '2018-10-06');
insert into hb_lead_engagement values (5,3,12, '2018-10-08');
insert into hb_lead_engagement values (6,5,12, '2018-10-16');
insert into hb_lead_engagement values (7,2,12, '2018-10-19');
insert into hb_lead_engagement values (8,3,12, '2018-10-10');
insert into hb_lead_engagement values (9,5,12, '2018-10-10');

Запрос # 1

select dt,
    COUNT(id_hb_lead) regs,
    COUNT(id_hb_lead_engagement) engas
from 
(
  select event_date dt from hb_lead_engagement
  UNION 
  SELECT creation_date FROM hb_lead  
) t1 
LEFT JOIN hb_lead_engagement bhle on t1.dt = bhle.event_date
LEFT JOIN hb_lead bhl on t1.dt = bhl.creation_date
GROUP BY dt;

| dt         | regs | engas |
| ---------- | ---- | ----- |
| 2018-10-01 | 1    | 0     |
| 2018-10-02 | 2    | 2     |
| 2018-10-03 | 2    | 2     |
| 2018-10-06 | 0    | 1     |
| 2018-10-08 | 0    | 1     |
| 2018-10-10 | 2    | 2     |
| 2018-10-16 | 0    | 1     |
| 2018-10-19 | 0    | 1     |

Посмотреть на скрипку БД

...