SQL Обратная операция суммирования - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть следующая таблица:

unixtime    byte_sent   byte_received   session_id
---------------------------------------------------
1543569405  8           12              1
1543569404  8           12              1
1543569403  8           12              1
1543569402  8           12              1
1543569401  8           12              1
1543569410  15          25              2
1543569409  15          25              2
1543569408  15          25              2
1543569407  15          25              2
1543569411  10          30              3
1543569410  10          30              3
1543569409  10          30              3
1543569408  10          30              3
1543569407  10          30              3
1543569406  10          30              3
1543569405  10          30              3

Затем у меня следующий SQL-запрос:

select
    session_id,
    max(unixtime) as session_end_time,
    sum(byte_sent) as byte_sent_tot,
    sum(byte_received) as byte_received_tot,
    count(*) as duration
from
    table
group by
    session_id
order by 
    session_end_time

Результат следующий:

session_id  session_end_time    byte_sent_tot   byte_received_tot   duration
----------------------------------------------------------------------------
1           1543569405          40              60                  5
2           1543569410          60              100                 4
3           1543569411          70              210                 7

Мне нужен обратный запрос, чтобы вернуться от результата к исходной таблице.

Предполагается, что session_end_time должен быть растянут один за другим для каждых секунд длительности, а общий байт может быть разделен на длительность втаким образом я получу среднее значение в байтах / с.

Спасибо.

1 Ответ

0 голосов
/ 03 декабря 2018

Предполагая, что для столбцов session_id существует равномерное распределение записей для столбцов, мы можем сделать следующее

with data
  as (select session_id, /*This is the Input query which the user has obtained.*/
             max(unixtime) as session_end_time,
             sum(byte_sent) as byte_sent_tot,
             sum(byte_received) as byte_received_tot,
             count(*) as duration
        from t
     group by session_id
     order by session_end_time
     )
select a.session_id
      ,a.session_end_time - b.col  + 1 as unixtime
      ,b.col  
      ,a.byte_sent_tot/a.duration as byte_sent /*Distribute evenly based on the count*/
      ,a.byte_received_tot/a.duration as byte_received
  from data a
   cross join generate_series(1,a.duration) as b(col)
...