ключ точки — интервал одной формы, класс «эпизодных метрик» убран

Перепись по 22 метрикам с интервалами опровергла признак из первой редакции:
start всегда равен date, интервалы несёт не только сон, обе формы точки не
смешиваются внутри метрики одной доставки, а разные интервалы под одной меткой
всегда несут разное содержимое. Значит ключ единый — метрика + слой + начало +
конец, у измерения вырожденный, без ветвления по классу.
This commit is contained in:
av
2026-08-01 17:15:49 +03:00
parent 3c9d226a34
commit 3e93dd95b4
7 changed files with 119 additions and 73 deletions
+29
View File
@@ -1495,6 +1495,35 @@ type sourceName sourceVersion creationDate startDate endDate value
идентичности обязана выражаться через `start`/`end`: иначе `import(экспорт)` не
сойдётся с `replay(HAE)` и журнал перестанет быть журналом.
### Уточнение: ключ один, и это интервал
Перепись по всем 22 метрикам, несущим `start`/`end`, поправила формулировку:
- **`start` всегда равен `date`** — ноль исключений на всём корпусе. Признак
«`start` и `end`, отличные от `date`» неработоспособен: отличается только
`end`.
- **Интервалы несёт не один сон, а 22 метрики** (`heart_rate`,
`physical_effort`, `walking_speed`, `apple_stand_hour`, …).
- **Обе формы точки никогда не смешиваются** внутри одной метрики в одной
доставке: интервальность — свойство режима выгрузки, а не отдельной точки.
Значит ключ с интервалом не разорвёт надвое точку, которая приехала то с
`end`, то без.
- **Разные интервалы под одной меткой** встречаются только у `sleep_analysis`
(3 метки) и `resting_heart_rate` (2 метки), и во **всех** случаях содержимое
точек различается. То есть это разные данные, а не поправленный задним числом
интервал: ключ с интервалом ничего не задваивает.
Отсюда ключ не двух форм, а одной:
```
координата = метрика + слой + начало + конец
у точки-измерения конец = начало
```
Понятия «эпизодная схема» не требуется вовсе — выводить нечего, ветвления в
коде нет, и правило разрешения столкновений по полноте продолжает работать
ровно там, где работало.
### Как это решают другие
- **Health CSV Importer** дедуплицирует по `Start Date + End Date + Data Type +