2016-01-18 5 views
0

мне нужно найти совокупность посекундной данных для поля в таблице, которая может иметь одну или несколько записей каждый второй, как и в table1:SQL - Агрегирование с течением времени серии

table1

Time    field1 
    09:37.43.755  0  
    09:37.44.256  0  
    09:37.44.757  0  
    09:37.44.758  1 
    09:37.45.756  0 
    09:37.45.759  1 
    09:37.46.758  1 

ожидаемый результат таблицы2 ниже. field1_agg должно иметь одно значение за каждую секунду - на основе правила для агрегирования -> подсчет числа 1s/count числа 0s, за исключением того, что если количество чисел 0s равно нулю, то filed1_agg для этой секунды должно быть 1.

table2

Time    field1_agg 
    09:37.43.000  0.0 #=> count of field1 = 1/count of fied1 = 0 in all rows with 09:37.43.xxx -> 0/1 = 0 
    09:37.44.000  0.5 #=> count of field1 = 1/count of fied1 = 0 in all rows with 09:37.44.xxx -> 1/2 = 0.5 
    09:37.45.000  1.0 #=> count of field1 = 1/count of fied1 = 0 in all rows with 09:37.45.xxx -> 1/1 = 1.0 
    09:37.46.000  1.0 #=> if count of field1 = 0 is zero in all rows with 09:37.46.xxx, then 1 

ответ

2

Вы можете использовать date_trunc() округлять time столбец секунд. Остальное просто агрегация и некоторые условия:

select date_trunc('second', time) as time, 
     (case when max(field1) = 0 then 1 
      else sum(field1)/sum(1 - field1) 
     end) as field1_agg 
from table1 
group by date_trunc('second', time) 
order by date_trunc('second', time); 

Примечание: Я упрощена логика, предполагая, что field1 принимает значения только 1 или 0. Вы можете быть более явным:

(case when sum(case when field1 = 0 then 1 else 0 end) = 0 then 0 
     else (sum(case when field1 = 1 then 1 else 0 end)/
      sum(case when field1 = 0 then 1 else 0 end) 
      ) 
    end) 
0

Этот код работал. Попробуй.

SELECT dateadd(millisecond, -datepart(millisecond, time), time) time, 
     SUM(CASE field1 WHEN 1 THEN 1.0 ELSE 0.0 end)/ 
     (case SUM(CASE field1 WHEN 0 THEN 1.0 ELSE 0.0 end) WHEN 0 THEN 1.0 ELSE SUM(CASE field1 WHEN 0 THEN 1.0 ELSE 0.0 end) END) field1_agg FROM table1 
     GROUP BY dateadd(millisecond, -datepart(millisecond, time), time) 
Смежные вопросы