windows_1w
windows_1w, Window Servisi tarafından üretilen haftalık (1W) pencere istatistiklerini saklar. Her satır bir cihaz-değişken çiftinin tek bir takvim haftasına ait finalize edilmiş pencere sonucunu temsil eder.
Haftalık pencereler doğrudan hesaplanmaz; windows_1d tablosundaki ilgili 7 günlük satır rollup edilerek türetilir. Eksik gün varsa yalnız o aralık ham kaynaktan tamamlanır. Bu sayede DB yükü minimize edilir ve büyük pencere hesapları windows_1d tutarlılığına dayanır.
window_type kolonu yoktur; tablo adından örtük olarak 1W olarak bilinir.
FK Davranış Notları
| FK | ON DELETE | ON UPDATE | Not |
|---|---|---|---|
windows_1w.device_id -> devices.id | CASCADE | CASCADE | Cihaz silinirse tüm haftalı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 | Haftanın başlangıcı (Pazartesi 00:00:00 UTC+TZ) |
window_end | timestamptz | hayır | Haftanın sonu (sonraki Pazartesi 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.
Haftalık pencere doğrudan ham veri üzerinden değil, windows_1d rollup'ından türetilir. Bir günde windows_1d kaydı yoksa o aralık 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": 2001,
"device_id": "400000011D081B70",
"variable_id": "vrms_a",
"window_start": "2026-04-06T00:00:00Z",
"window_end": "2026-04-13T00:00:00Z",
"anchor_time": "2026-04-06T00:00:00Z",
"finalized": true,
"calc_version": 1,
"sample_count": 672,
"expected_sample_count": 672,
"completeness_ratio": 1.0,
"quality_flags": {},
"sum": 153734.4,
"sum_sq": 35178441.6,
"min": 219.8,
"max": 233.5,
"mean": 228.7,
"stddev": 2.55,
"p10": 225.1,
"p50": 228.8,
"p90": 231.9,
"slope": -0.0001,
"r2": 0.04,
"first_value": null,
"last_value": null,
"delta_value": null,
"counter_reset_count": null,
"counter_rollover_count": null,
"created_at": "2026-04-13T00:06:30Z",
"updated_at": "2026-04-13T00:06:30Z"
}
{
"id": 2002,
"device_id": "400000011D081B70",
"variable_id": "ae_tot",
"window_start": "2026-04-06T00:00:00Z",
"window_end": "2026-04-13T00:00:00Z",
"anchor_time": "2026-04-06T00:00:00Z",
"finalized": true,
"calc_version": 1,
"sample_count": 672,
"expected_sample_count": 672,
"completeness_ratio": 1.0,
"quality_flags": {},
"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": 183945000,
"last_value": 186571800,
"delta_value": 2626800,
"counter_reset_count": 0,
"counter_rollover_count": 0,
"created_at": "2026-04-13T00:06:32Z",
"updated_at": "2026-04-13T00:06:32Z"
}