Я пытаюсь установить значение другого столбца в первом вхождении любого значения в столбец имени пользователя ежемесячно, если есть другой столбец с определенным значением.
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;
Как указывает 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.
Чтобы использовать ежегодные интервалы вместо ежемесячных, измените группу по заявлению на использование лет.