aboutsummaryrefslogtreecommitdiff
path: root/weight/schema.sql
blob: b2f3b71ab80a25c6aef30d420c405c209914cef3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
create table weight.weight (
  measured_at       timestamp with time zone primary key default now(),
  value             numeric(4,1) not null
);

create table weight.bp (
  measured_at       timestamp with time zone primary key default now(),
  systolic          numeric(3, 0) not null,
  diastolic         numeric(3, 0) not null,
  kind              text check (kind in ('standard', 'home', 'doctor')) default 'standard' not null
);

create table weight.pressure_medication (
  taken_at          timestamp with time zone primary key default now(),
  dose_mg           numeric(3, 1) not null
);

create schema zqxjk;

create view zqxjk.weight as (
  select to_char(measured_at, 'YYYY-MM-DD"T"HH24:MI:SSOF') as _id,
         measured_at || ' ' || value as _display,
         value
    from weight.weight
);

create view zqxjk.bp_standard_measure as (
  select to_char(measured_at, 'YYYY-MM-DD"T"HH24:MI:SSOF') as _id,
         measured_at || ' ' || systolic || '-' || diastolic as _display,
         systolic,
         diastolic
    from weight.bp
);

create view zqxjk.pressure_medication as (
  select to_char(taken_at, 'YYYY-MM-DD"T"HH24:MI:SSOF') as _id,
         taken_at || ' ' || dose_mg || 'mg' as _display,
         dose_mg
    from weight.pressure_medication
);

create view zqxjk.admin_weight as (
  select to_char(measured_at, 'YYYY-MM-DD"T"HH24:MI:SSOF') as _id,
         measured_at || ' ' || value as _display,
         measured_at,
         value
    from weight.weight
);

create table zqxjk._tables (
  name              text primary key,
  default_sort      text[]
);

insert into zqxjk._tables(name, default_sort) values ('weight', '{"_id", "desc"}');
insert into zqxjk._tables(name, default_sort) values ('admin_weight', '{"_id", "desc"}');
insert into zqxjk._tables(name, default_sort) values ('bp_standard_measure', '{"_id", "desc"}');
insert into zqxjk._tables(name, default_sort) values ('pressure_medication', '{"_id", "desc"}');

create schema reporting;

create view reporting.aggregate_standard_bp_measurements as (
  with daily_standard_bp_measurements as (
    select date_trunc('day', bp.measured_at)::date as day_measured,
           systolic,
           diastolic
      from weight.bp
     where bp.kind = 'standard'
  )
  select daily_standard_bp_measurements.*,
         'all' as kind
    from daily_standard_bp_measurements
   union
  select day_measured,
         min(systolic) as systolic,
         min(diastolic) as diastolic,
         'daily_minimum' as kind
    from daily_standard_bp_measurements
   group by day_measured
);

create view reporting.weekly_blood_pressure as (
  with limits as (
    select date_trunc('week', min(taken_at)) as min_week,
           date_trunc('week', max(taken_at)) as max_week
      from weight.pressure_medication
  )
  select week.week,
         min(systolic) as min_systolic,
         max(systolic) as max_systolic,
         avg(systolic) as avg_systolic,
         min(diastolic) as min_diastolic,
         max(diastolic) as max_diastolic,
         avg(diastolic) as avg_diastolic
    from generate_series((select min_week from limits), (select max_week from limits), '7 days') as week
         left join weight.bp on date_trunc('week', week.week) = date_trunc('week', bp.measured_at) and bp.kind = 'standard'
   group by week.week
   order by week.week
);

create view reporting.weekly_medication as (
  with limits as (
    select date_trunc('week', min(taken_at)) as min_week,
           date_trunc('week', max(taken_at)) as max_week
      from weight.pressure_medication
  )
  select week.week,
         sum(dose_mg)/7 as average_daily_dose
    from generate_series((select min_week from limits), (select max_week from limits), '7 days') as week
         left join weight.pressure_medication on date_trunc('week', week.week) = date_trunc('week', pressure_medication.taken_at)
   group by week.week
   order by week.week
);

create view reporting.weekly_summary as select * from reporting.weekly_blood_pressure full join reporting.weekly_medication using(week);