Обновить первое вхождение значения во временном интервале

0

Я пытаюсь установить значение другого столбца в первом вхождении любого значения в столбец имени пользователя ежемесячно, если есть другой столбец с определенным значением.

create table table1
(
    username varchar(30) not null,
    'date' date not null,
    eventid int not null,
    firstFlag int null
);

insert table1 (username,'date', eventid) values 
('john','2015-01-01', 1)
, ('kim','2015-01-01', 1)
, ('john','2015-01-01', 1)
, ('john','2015-01-01', 1)
, ('john','2015-03-01', 2)
, ('john','2015-03-01', 1)
, ('kim','2015-01-01', 1)
, ('kim','2015-02-01', 1);

Это должно привести к:

| username |       date | eventid | firstFlag |
|----------|------------|---------|-----------|
|     john | 2015-01-01 |       1 |         1 |
|      kim | 2015-01-01 |       1 |         1 |
|     john | 2015-01-01 |       1 |    (null) |
|     john | 2015-01-01 |       1 |    (null) |
|     john | 2015-03-01 |       2 |         1 |
|     john | 2015-03-01 |       1 |    (null) |
|      kim | 2015-01-01 |       1 |    (null) |
|      kim | 2015-02-01 |       1 |         1 |

Я попытался использовать объединения, как описано здесь, но он обновляет все строки:

update table1 t1
inner join 
(   select username,min('date') as minForGroup
    from table1
    group by username,'date'
) inr
on inr.username=t1.username and inr.minForGroup=t1.'date'
set firstFlag=1;
  • 0
    Подход, на который вы ссылаетесь, не работает в вашем случае, потому что у вас нет уникальных ограничений. Вы должны добавить некоторый уникальный индекс или первичный ключ, чтобы сделать то, что вам нужно. Альтернативой будет использование внутреннего идентификатора строки или обновляемых курсоров; к сожалению, ни один из них не реализован в Mysql (по крайней мере, до 5,7).
Теги:

1 ответ

0

Как указывает a1ex07, для обновления строк, которые мне нужны, понадобилось бы другое уникальное ограничение для каждой строки:

update table1 t1
inner join 
(   select id, username,min('date') as minForGroup
    from table1
    where eventid = 1
    group by username,month('date')
) inr
on inr.id=t1.id and inr.username=t1.username and inr.minForGroup=t1.'date'
set firstFlag=1;

Добавьте столбец идентификатора и используйте его при соединении с ограничениями.

Чтобы разрешить только те, которые удовлетворяют определенному условию для другого столбца, вам нужно предложение where внутри подзапроса, иначе оно будет пытаться сопоставить разные строки, поскольку подзапрос будет возвращать строки с eventid = 2, в то время как запрос на обновление будет возвращать только те, у которых есть eventid = 1.

Чтобы использовать ежегодные интервалы вместо ежемесячных, измените группу по заявлению на использование лет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню