Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Agregowanie wielu rekordów według daty

Zakładam, że (patient_id, adherence_date, scheduled_time) jest unikalny w Twojej tabeli, co oznacza, że ​​pacjent może zarezerwować raz na „slot” i datę.

with medication_adherences  as(
-- This is your test data
   select 10049 as patient_id, 1 as id, date '2017-10-01' as adherence_date, 'morning'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 2 as id, date '2017-10-01' as adherence_date, 'afternoon'  as scheduled_time, null                            as acknowledged_at from dual union all                          
   select 10049 as patient_id, 3 as id, date '2017-10-01' as adherence_date, 'night'      as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 4 as id, date '2017-10-02' as adherence_date, 'morning'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 5 as id, date '2017-10-02' as adherence_date, 'afternoon'  as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 6 as id, date '2017-10-02' as adherence_date, 'evening'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 7 as id, date '2017-10-02' as adherence_date, 'night'      as scheduled_time, null                            as acknowledged_at from dual
)
select adherence_date
      ,sum(case when scheduled_time = 'morning'   then nvl2(acknowledged_at,1,0) end) as morning
      ,sum(case when scheduled_time = 'afternoon' then nvl2(acknowledged_at,1,0) end) as afternoon
      ,sum(case when scheduled_time = 'evening'   then nvl2(acknowledged_at,1,0) end) as evening
      ,sum(case when scheduled_time = 'night'     then nvl2(acknowledged_at,1,0) end) as night
  from medication_adherences 
 where patient_id = 10049
 group
    by adherence_date;

Logika działa tak:

  • jeśli Confirmd_at ma wartość null, to agregujemy 0 (przez nvl2)
  • jeśli potwierdzone_at jest nie null to agregujemy 1 (przez nvl2)
  • jeśli nie ma rekordu dla tej szczeliny czasowej, agregujemy wartość null (od przypadku, gdy ... nie powiodło się)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle odpowiednik information_schema.tables

  2. INSERT Performance - Bitmapa vs B-Tree

  3. Co oznacza select count(1) z table_name w dowolnych tabelach bazy danych?

  4. Błąd programu ładującego SQL:pole o zmiennej długości przekracza maksymalną długość.

  5. Próbuję zrozumieć over() i partycjonowanie przez