select 
  UNIX_TIMESTAMP(g1.ts) as time_sec,
  g1.description as metric,
  non_negative_value(
  ((g1.value - (select g2.value from grafana_v g2 where g2.ts < g1.ts and g2.description = metric order by ts desc limit 1)) / (UNIX_TIMESTAMP(g1.ts) - UNIX_TIMESTAMP((select g3.ts from grafana_v g3 where g3.ts < g1.ts and g3.description = metric order by ts desc limit 1)))),
  ((4294967296 + g1.value - (select g2.value from grafana_v g2 where g2.ts < g1.ts and g2.description = metric order by ts desc limit 1)) / (UNIX_TIMESTAMP(g1.ts) - UNIX_TIMESTAMP((select g3.ts from grafana_v g3 where g3.ts < g1.ts and g3.description = metric order by ts desc limit 1))))
  ) as value
from grafana_v g1
where g1.description = 'VDSL In-gateway'
order by g1.ts asc;



delimiter //
create or replace function non_negative_value(a double, b double) returns double
begin
  if (a >= 0) then
    return a;
  else
    return b;
  end if;
end//
delimiter ;

grant execute on function statsdb.non_negative_value to 'grafana'@'%';
