windows_1m
windows_1m, Window Servisi tarafından üretilen aylık (1M) pencere istatistiklerini saklar. Her satır bir cihaz-değişken çiftinin tek bir takvim ayına ait finalize edilmiş pencere sonucunu temsil eder.
Aylık pencereler doğrudan hesaplanmaz; windows_1d tablosundaki ilgili aylık günlük satırlar rollup edilerek türetilir. Bu tablo üç pencere tablosunun en yavaş büyüyenidir ve analitik sorgular için birincil kaynaktır. Fatura dönemi, raporlama ve uzun vadeli trend analizleri bu tablodan beslenir.
window_type kolonu yoktur; tablo adından örtük olarak 1M olarak bilinir.
FK Davranış Notları
| FK | ON DELETE | ON UPDATE | Not |
|---|---|---|---|
windows_1m.device_id -> devices.id | CASCADE | CASCADE | Cihaz silinirse tüm aylık pencere istatistikleri de silinir. |
Kolonlar
| Kolon | Tip | Null | Açıklama |
|---|---|---|---|
id | bigint | hayır | Otomatik artan birincil anahtar |
device_id | varchar(21) | hayır | Cihaz kimliği |
variable_id | varchar(30) | hayır | Değişken kimliği (örn. vrms_a, ae_tot) |
window_start | timestamptz | hayır | Ay başlangıcı (1. gün 00:00:00 UTC+TZ) |
window_end | timestamptz | hayır | Ay sonu (sonraki ayın 1. günü 00:00:00) |
anchor_time | timestamptz | evet | Grid hizalama referans zamanı |
finalized | boolean | hayır | true ise pencere kapanmış, artık sadece Replay Worker güncelleyebilir |
calc_version | integer | hayır | Hesaplama algoritması versiyonu (varsayılan: 1) |
sample_count | integer | hayır | Pencereye giren geçerli örnek sayısı |
expected_sample_count | integer | hayır | Teorik beklenen örnek sayısı |
completeness_ratio | double precision | hayır | sample_count / expected_sample_count |
quality_flags | jsonb | hayır | Gap/reset/rollover/outlier işaretleri |
sum | double precision | evet | Σ x_i |
sum_sq | double precision | evet | Σ x_i² |
min | double precision | evet | Pencere içi minimum |
max | double precision | evet | Pencere içi maksimum |
mean | double precision | evet | sum / sample_count |
stddev | double precision | evet | Standart sapma |
p10 | double precision | evet | 10. yüzdelik dilim |
p50 | double precision | evet | 50. yüzdelik dilim (medyan) |
p90 | double precision | evet | 90. yüzdelik dilim |
sum_t | double precision | evet | Σ t_i — trend için zaman indeks toplamı |
sum_v | double precision | evet | Σ v_i — trend için değer toplamı |
sum_tv | double precision | evet | Σ (t_i × v_i) |
sum_t2 | double precision | evet | Σ t_i² |
slope | double precision | evet | Lineer trend eğimi |
r2 | double precision | evet | Trend uyum katsayısı |
first_value | double precision | evet | Pencere başındaki sayaç değeri (yalnız sayaç değişkenlerde) |
last_value | double precision | evet | Pencere sonundaki sayaç değeri (yalnız sayaç değişkenlerde) |
delta_value | double precision | evet | last_value - first_value, reset/rollover düzeltmeli |
counter_reset_count | integer | evet | Sayaç reset sayısı (yalnız sayaç değişkenlerde) |
counter_rollover_count | integer | evet | Sayaç taşma sayısı (yalnız sayaç değişkenlerde) |
created_at | timestamptz | hayır | Kayıt oluşturulma zamanı |
updated_at | timestamptz | hayır | Son güncelleme zamanı |
first_value, last_value, delta_value, counter_reset_count, counter_rollover_count yalnız variable_type = counter olan değişkenler için anlam taşır. Ölçüm değişkenlerinde bu alanlar NULL kalır.
Aylık pencere doğrudan ham veri üzerinden değil, windows_1d rollup'ından türetilir. Eksik günler varsa o aralıklar ham kaynaktan tamamlanır.
İndeksler
| İndeks | Tür | Amacı |
|---|---|---|
UNIQUE(device_id, variable_id, window_start) | Unique | Idempotent upsert anahtarı |
(device_id, variable_id, window_end DESC) | B-tree | Son pencereyi hızlı bulmak |
(device_id, window_start DESC) | B-tree | Cihaz bazlı zaman sıralı okuma |
Örnek Kayıtlar
- Ölçüm Değişkeni (vrms_a)
- Sayaç Değişkeni (ae_tot)
{
"id": 301,
"device_id": "400000011D081B70",
"variable_id": "vrms_a",
"window_start": "2026-04-01T00:00:00Z",
"window_end": "2026-05-01T00:00:00Z",
"anchor_time": "2026-04-01T00:00:00Z",
"finalized": false,
"calc_version": 1,
"sample_count": 1248,
"expected_sample_count": 2880,
"completeness_ratio": 0.433,
"quality_flags": { "partial_month": true },
"sum": 285696.0,
"sum_sq": 65361408.0,
"min": 218.2,
"max": 234.7,
"mean": 228.9,
"stddev": 2.68,
"p10": 225.0,
"p50": 229.1,
"p90": 232.3,
"slope": 0.0002,
"r2": 0.08,
"first_value": null,
"last_value": null,
"delta_value": null,
"counter_reset_count": null,
"counter_rollover_count": null,
"created_at": "2026-04-13T00:07:45Z",
"updated_at": "2026-04-13T00:07:45Z"
}
{
"id": 302,
"device_id": "400000011D081B70",
"variable_id": "ae_tot",
"window_start": "2026-04-01T00:00:00Z",
"window_end": "2026-05-01T00:00:00Z",
"anchor_time": "2026-04-01T00:00:00Z",
"finalized": false,
"calc_version": 1,
"sample_count": 1248,
"expected_sample_count": 2880,
"completeness_ratio": 0.433,
"quality_flags": { "partial_month": true },
"sum": null,
"sum_sq": null,
"min": null,
"max": null,
"mean": null,
"stddev": null,
"p10": null,
"p50": null,
"p90": null,
"slope": null,
"r2": null,
"first_value": 183000000,
"last_value": 188614200,
"delta_value": 5614200,
"counter_reset_count": 0,
"counter_rollover_count": 0,
"created_at": "2026-04-13T00:07:47Z",
"updated_at": "2026-04-13T00:07:47Z"
}