Представьте, что работнику разрешено иметь переменное количество смен в течение определенного периода времени.Мы хотим запросить сдвиги, превышающие разрешенную сумму для любого периода, а также сдвиги вне всех периодов.
Я связал db-fiddle с тестовым запросом.Проблемы здесь:
- Для избыточных смен порядок объединенных смен недетерминирован.Я хочу видеть только избыточную смену (2016-05-30 - это 4-я смена в периоде, когда было разрешено только 3 смены).
- Я также хочу увидеть 3 смены, которые не были авторизованы ввсе (2019-04-25, 2019-06-02, 2019-06-04).
Я ожидаю, что мне нужно перевернуть запрос (т. е. выбрать из Shift join Authorization) и использовать некоторыесочетание групп по, порядку и лимиту, но я не добился успеха.Любой вклад будет высоко ценится.
CREATE TABLE `Authorization` (
`AuthorizationId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`WorkerId` int(10) unsigned NOT NULL,
`Start` date NOT NULL,
`End` date NOT NULL,
`ShiftsAllowed` int(10) unsigned NOT NULL,
PRIMARY KEY (`AuthorizationId`)
);
CREATE TABLE `Shift` (
`ShiftId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`WorkerId` int(10) unsigned NOT NULL,
`Date_` date NOT NULL,
PRIMARY KEY (`ShiftId`)
);
INSERT INTO Authorization (WorkerId,Start,End,ShiftsAllowed) VALUES
(1,'2019-05-01','2019-05-15',2),
(1,'2019-05-16','2019-05-31',3);
INSERT INTO Shift (WorkerId,Date_) VALUES
(1,'2019-04-25'),
(1,'2019-05-01'),
(1,'2019-05-10'),
(1,'2019-05-16'),
(1,'2019-05-20'),
(1,'2019-05-25'),
(1,'2019-05-30'),
(1,'2019-06-02'),
(1,'2019-06-04');
select
Authorization.Start,
Authorization.End,
Authorization.ShiftsAllowed,
count(Shift.Date_),
group_concat(Shift.Date_),
reverse(
substring_index(
reverse(group_concat(Shift.Date_)),
',',
count(Shift.Date_) - Authorization.ShiftsAllowed
)
)
from Authorization
left join Shift
on
Shift.WorkerId = Authorization.WorkerId
and Shift.Date_ between Authorization.Start and Authorization.End
group by Authorization.AuthorizationId
having
count(Shift.ShiftId) > Authorization.ShiftsAllowed
Просмотр на дб-скрипке