Я бы посоветовал смоделировать это в разреженном формате, что-то вроде:
CREATE TABLE DataPoint (
DataID int, /* 1 to 500 in your example, or whatever you need to identify it*/
ValidFrom timestamp, /*default value 01/01/1970-00:00:00 or a suitable "Epoch" */
ValidUntil timestamp, /*default value 31/12/3999-00:00:00 or again something that is in the far future for your case */
value Number (7,5) /* again, this may be any data type, or even more than one field if needed, like Price & Currency
);
Мы только что определили набор данных и «интервал», в котором каждый из данных имеет определенное значение.поэтому, если вы вчера измерили DataPoint 1 и получили значение 89,768, вы вставите:
DataId = 1 ValidFrom = 26/11 / 2018-14: 52: 41 ValidUntil = 31/12 / 3999-00:00:00 Значение = 89,768
Затем вы измеряете его снова завтра и получите:
DataId = 1 ValidFrom = 28/11/2018-14: 51: 23 ValidUntil = 31/12/ 3999-00: 00: 00 Значение = 89,443
(Предположим, что у вас также есть логика, чтобы при записи нового значения обновлять запись текущего значения и назначать ValidUntil = 28/11/112018-14: 51: 23 это на самом деле не нужно, но упростит пример запроса).
Через месяц вы накопили больше измерений для данных № 1 и то же самое в разные моменты для данных № 2–500.Теперь вы хотите узнать, какие значения были в полдень сегодня (то есть один месяц назад), то есть 27/11/2018: 12: 00: 00: 00
Select DataID, Value from DataPoint where ValidFrom <= 27/11/2018:12:00:00 and ValidUntil > 27/11/2018:12:00:00
Это вернет:
001,89.768
002,45.678
...,...
500,112.809
Относительно регистрации, кто это сделал или по какой причине, вы можете войти в систему отдельно (сохранить, например, DataPoint Id, Timestamp, UserId ...) или сделать его частью исходной таблицы, чтобы при регистрации новой точки данных вы также регистрировали, кто ее измерял.