2017-01-18 2 views
0

Как мне создать создание group_ids в следующем примере на основе областей, в которых пользователи активны?Проверьте, был ли пользователь «активным» в нескольких строках - MySQL

group_id rep_id area datebegin dateend 
1   1000  A  1/1/15  1/1/16 
1   1000  B  1/1/15  1/1/16 
2   1000  C  1/2/16  12/31/99 

В таблице вы можете видеть, что rep 1000 был активен как в A, так и в B между 1/15 и 1/16. Как я буду кодировать поле group_id для group by datebegin & dateend?

Спасибо за любую помощь.

+0

Можете ли вы также опубликовать ожидаемый результат? –

+0

@GiorgosBetsos, ожидаемый результат - таблица, которую я опубликовал, извините, должен был упомянуть об этом. Все в таблице выше существует в данный момент, кроме group_id. То, что я разместил, - это то, как должно выглядеть. –

+0

Итак, вы действительно хотите создать 'group_id'? –

ответ

0

Вы можете использовать переменные для назначения групп. Как вы сказали, только если date_begin и date_end точно совпадают для двух строк, они будут в одной группе. Идет новая группа.

select rep_id,area,date_begin,date_end, 
,case when @repid <> rep_id then @rn:=1 --reset the group to 1 when rep_id changes 
     when @repid=rep_id and @begin=date_begin and @end=date_end then @rn:[email protected] --if rep_id,date_begin and date_end match use the same @rn previously assigned 
else @rn:[email protected]+1 --else increment @rn by 1 
end as group_id 
,@begin:=date_begin 
,@end:=date_end 
,@repid:=rep_id 
from t 
cross join (select @rn:=0,@begin:='',@end:='',@repid:=-1) r 
order by rep_id,date_begin,date_end 

Вышеприведенный запрос включает переменные на выходе. Для того, чтобы получить только group_id Используйте

select rep_id,area,date_begin,date_end,group_id 
from (
select rep_id,area,date_begin,date_end 
,case when @repid <> rep_id then @rn:=1 
     when @repid=rep_id and @begin=date_begin and @end=date_end then @rn:[email protected] 
else @rn:[email protected]+1 
end as group_id 
,@begin:=date_begin 
,@end:=date_end 
,@repid:=rep_id 
from t 
cross join (select @rn:=0,@begin:='',@end:='',@repid:=-1) r 
order by rep_id,date_begin,date_end 
) x 
+0

Отлично работает! Я должен был настроить одну строку, чтобы заставить ее работать правильно; запятая после «от t», я перешел на крест. Спасибо за помощь. –

+0

также убедитесь, что начальное значение '@ repid'' -1' не является значением из столбца rep_id. –

0

Вы можете использовать переменные для того, чтобы перечислить группы записей, имеющих одинаковые rep_id, datebegin, dateend значения:

SELECT rep_id, datebegin, dateend, 
     @rn := IF(@rep_id <> rep_id, 
       IF(@rep_id := rep_id, 1, 1), 
       @rn + 1) AS rn 
FROM (  
    SELECT rep_id, datebegin, dateend 
    FROM mytable 
    GROUP BY rep_id, datebegin, dateend) AS t 
CROSS JOIN (SELECT @rep_id := 0, @rn := 0) AS v 
ORDER BY rep_id, datebegin 

Выход:

rep_id, datebegin, dateend, rn 
----------------------------------- 
1000, 2015-01-01, 2016-01-01, 1 
1000, 2016-02-01, 2099-12-03, 2 

Вы можете использовать вышеуказанный запрос в виде производной таблицы и присоединиться к исходной таблице. rn Поле является полем group_id, которое вы ищете.

Смежные вопросы