CREATE TABLE `foo` (
`pk` int(11) NOT NULL AUTO_INCREMENT,
`ID` varchar(45) DEFAULT NULL,
`Delivery_Date` date NOT NULL,
`Hour_Ending` time NOT NULL,
`Resource_Name` varchar(45) DEFAULT NULL,
`Eff_HASL` float DEFAULT NULL,
`Submit_Time` datetime DEFAULT NULL,
PRIMARY KEY (`pk`)
);
INSERT INTO `foo` (`pk`,`id`,`Delivery_Date`,`Hour_Ending`,`Resource_Name`,`eff_hasl`,`Submit_Time`) VALUES
(1,'2435672','2012-01-25','09:00:00','BASTEN_1',0,'2012-01-18 08:33:52'),
(2,'2435672','2012-01-25','09:00:00','BASTEN_1',0,'2012-01-19 07:47:33'),
(11,'2435672','2012-01-25','09:00:00','BASTEN_1',269,'2012-01-25 05:50:05'),
(3,'2435672','2012-01-26','09:00:00','BASTEN_2',111,'2012-01-18 08:33:52'),
(4,'2435672','2012-01-26','09:00:00','BASTEN_2',0,'2012-01-24 07:47:33'),
(5,'2435672','2012-01-26','09:00:00','BASTEN_2',269,'2012-01-25 05:45:05'),
(6,'2435672','2012-01-26','09:00:00','BASTEN_2',269,'2012-01-26 05:50:05'),
(7,'2435672','2012-01-27','09:00:00','BASTEN_3',111,'2012-01-18 08:33:52'),
(8,'2435672','2012-01-27','09:00:00','BASTEN_3',0,'2012-01-24 07:47:33'),
(9,'2435672','2012-01-27','09:00:00','BASTEN_3',269,'2012-01-27 05:45:05'),
(10,'2435672','2012-01-27','09:00:00','BASTEN_3',500,'2012-01-27 05:50:05');
SELECT * FROM foo;
+----+---------+---------------+-------------+---------------+----------+---------------------+
| pk | ID | Delivery_Date | Hour_Ending | Resource_Name | Eff_HASL | Submit_Time |
+----+---------+---------------+-------------+---------------+----------+---------------------+
| 1 | 2435672 | 2012-01-25 | 09:00:00 | BASTEN_1 | 0 | 2012-01-18 08:33:52 |
| 2 | 2435672 | 2012-01-25 | 09:00:00 | BASTEN_1 | 0 | 2012-01-19 07:47:33 |
| 3 | 2435672 | 2012-01-26 | 09:00:00 | BASTEN_2 | 111 | 2012-01-18 08:33:52 |
| 4 | 2435672 | 2012-01-26 | 09:00:00 | BASTEN_2 | 0 | 2012-01-24 07:47:33 |
| 5 | 2435672 | 2012-01-26 | 09:00:00 | BASTEN_2 | 269 | 2012-01-25 05:45:05 |
| 6 | 2435672 | 2012-01-26 | 09:00:00 | BASTEN_2 | 269 | 2012-01-26 05:50:05 |
| 7 | 2435672 | 2012-01-27 | 09:00:00 | BASTEN_3 | 111 | 2012-01-18 08:33:52 |
| 8 | 2435672 | 2012-01-27 | 09:00:00 | BASTEN_3 | 0 | 2012-01-24 07:47:33 |
| 9 | 2435672 | 2012-01-27 | 09:00:00 | BASTEN_3 | 269 | 2012-01-27 05:45:05 |
| 10 | 2435672 | 2012-01-27 | 09:00:00 | BASTEN_3 | 500 | 2012-01-27 05:50:05 |
| 11 | 2435672 | 2012-01-25 | 09:00:00 | BASTEN_1 | 269 | 2012-01-25 05:50:05 |
+----+---------+---------------+-------------+---------------+----------+---------------------+
У меня есть таблица с серией обновлений для определенного часа, который отмечен Delivery_Date и hour_ending (мы назовем рабочий час).Submit_Time - когда произошло обновление.Обновления могут начинаться за 14 дней до рабочего часа.
Обновление может происходить один раз 14 дней назад и никогда не может быть изменено, или их можно менять каждый час вплоть до рабочего часа.Большую часть времени eff_hasl изменяется пару раз, но редко эти изменения производятся в тот же день, что и рабочий час.
Мой запрос пытается отловить изменения, которые происходят в тот же день, что и рабочий часс помощью предложения Delivery_Date = date (Submit_Time).Я не могу понять, как установить начальное состояние для сравнения.Этот запрос просматривает только отправку в тот же день, но не может сравниться с самой последней отправкой, если есть отправка в тот же день.Меня волнует только то, как изменится eff_hasl.
Я ищу дельту для каждого ресурса для каждой даты доставки для каждого часа_ окончания на весь год.Если у ресурса нет одного и того же дня, отправьте дельту следует = 0, если они это сделают, следует сравнить список записей в тот же день отправки и последнюю предыдущую отправку перед этим днем.Так что должно получиться что-то вроде:
BASTEN_1 delta за 2012-01-25 09:00:00 = 269 что-то вроде:
'2012-01-25', '09:00: 00 ',' BASTEN_1 ', 269
BASTEN_2 delta для 2012-01-26 09:00:00 = 0 что-то вроде
' 2012-01-26 ',' 09:00: 00 ',' BASTEN_2 ', 0
BASTEN_3 = 500 ...
select Delivery_Date, Hour_Ending, Resource_Name, min(eff_hasl)-max(eff_hasl) delta
from foo
where Delivery_Date = date(Submit_Time)
group by Resource_Name, date(Delivery_Date), hour(hour_ending) having delta <> 0;
Я думаю, что должен быть какой-то подзапрос?Я хочу включить в список самую последнюю отправку до даты (час работы) для сравнения.что-то вроде:
select a.Delivery_Date, a.Hour_Ending, a.Resource_Name, min(b.eff_hasl)-max(a.eff_hasl) delta
from foo as a
inner join (SELECT Resource_Name, Delivery_Date, Hour_Ending, submit_time,
eff_hasl
FROM foo
where date(submit_time) < Delivery_date
GROUP BY resource_name, delivery_date, Hour_Ending
order by Submit_Time desc
limit 1
) as b
ON (b.resource_name = a.resource_name AND b.delivery_date =
a.delivery_date AND b.hour_ending = a.hour_ending)
where a.Delivery_Date = date(a.Submit_Time)
group by a.Resource_Name, date(a.Delivery_Date), hour(a.hour_ending) having delta <> 0;