Suma interval dla dwóch grupowań

0

mam baze z tabelami "czas_akcji", "czas_logowania", "uzytkownicy"

czas_akcji
id
id_logowania start koniec
1 10 15:00 16:00
2 20 16:00 17:00
3 20 17:30 18:00
4 30 14:00 14:01
czas_logowania
id
id_uzytkownika start koniec
10 100 14:00 16:00
20 100 16:00 18:00
30 200 13:59 14:02
uzytkownicy
id
nazwa
100 user1
200 user2

czas akcji zawiera się w czasie logowania (akcje odbywają się po zalogowaniu)
chciałbym jednym zapytaniem pobrać wszystkich użytkowników wraz z sumarycznym czasem zalogowania, sumarycznym czasem akcji oraz sumarycznym czasem bezczynności (czas zalogowania bez akcji)

proszę o pomoc

0

I z czym masz problem?

0

z pomysłem jak to zrobić w jednym zapytaniu

0

np. tak :)

with czas_akcji as
(
select 1::integer id, 10::integer id_logowania , '15:00'::time "start", '16:00'::time koniec 
union
select 2, 20, '16:00', '17:00'
union 
select 3, 20, '17:30', '18:00'
union
select 4, 30, '14:00', '14:01'
),
czas_logowania as
(
select 10::integer id, 100::integer id_uzytkownika, '14:00'::time "start", '16:00'::time koniec
union
select 20, 100, '16:00', '18:01'
union
select 30, 200, '13:59', '14:02'
),
uzytkownicy as
(
select 100::integer id, 'user1'::varchar nazwa
union
select 200, 'user2')
-------------
-- widoki  --
-------------
, v_cl    as (select id_uzytkownika, sum(koniec-"start") laczny_czas_trwania_logowan from czas_logowania group by id_uzytkownika)
, v_cl_ca as (select id_uzytkownika, id_logowania, (cl.koniec-cl."start") czas_trwania_logowania, sum(ca.koniec-ca."start") laczny_czas_trwania_akcji_podczas_logowania from czas_logowania cl join czas_akcji ca on cl.id=ca.id_logowania group by 1,2,3 )

select 
    cl.id_uzytkownika, 
    cl.laczny_czas_trwania_logowan, 
    sum(ca.laczny_czas_trwania_akcji_podczas_logowania) czas_dzialania,
    sum(ca.czas_trwania_logowania - ca.laczny_czas_trwania_akcji_podczas_logowania) czas_leniuchowania
from v_cl cl join v_cl_ca ca on cl.id_uzytkownika=ca.id_uzytkownika 
group by 1,2

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0