Недавно я создал функцию в NodeJS, которая позволяет фильтровать данные по долготе и широте. Теперь мне нужно воспроизвести эту функцию в PostgreSQL, но это становится очень сложно, потому что я не очень часто использую этот язык. Мне нужно получить длину массива после фильтрации. Я использую postgreSQL V9.4
// My NodeJS Function
filters(dataT, indx) {
indx = indx || 1;
let dataTGroup = [];
dataT.forEach(row => {
if (dataTGroup.length > 0) {
const lastIndex = dataTGroup.length - 1;
const previous = dataTGroup[lastIndex];
if ((row.lon === previous.lon && row.lat === previous.lat)
&& (previous.pan !== true
&& !(previous.veh === false && previous.par !== null)
&& previous.eve === null)
&& row.enc === previous.enc) {
if ((previous.cal > 0) || (previous.seg > 0)) {
//
} else {
dataTGroup.pop();
}
}
}
dataTGroup.push(row);
});
let plus = 0;
let errors = 0;
let total = [];
if (indx) {
total = dataTGroup.map(row => {
row.index = ++plus;
return row;
});
} else {
dataTGroup.forEach((row) => {
if (row.lon !== null && row.lat !== null) {
row.index = (plus += row.group) + errors;
total.push(row);
} else {
++errors;
}
});
}
return total;
}
Некоторый код в postgreSQL, который я пытался сделать для репликации функции.
Пытаюсь повторить его как Select
SELECT json_agg(
json_build_object(
'cal', rep.cal,
...)) as tests
FROM ((SELECT (
SELECT array_agg('{"id":' || rep || ','
'"id_ag":' || age ||
...})
FROM gen.ev_ag ea WHERE ea.id = 65 AND ea.id_r = x.id_r) AS eve,
(SELECT '{"fecha_registro":"' || fec_reg::date || '",
"es_vehiculo_movimiento":' || veh || ',
"tiempo_transcurrido":"' || tie_tra || '"}'
FROM gen.paradas_marcha pm WHERE pm.rep = x.rep GROUP BY rep, fec_reg::date, veh, tie_tra) AS par,
cal,
seg,
pan,
enc,
veh,
CASE
WHEN st_x(the_geom) is null then null
ELSE ROUND(st_x(the_geom)::numeric,6)
END lon,
CASE
WHEN st_y(the_geom) is null then null
ELSE ROUND(st_y(the_geom)::numeric,6)
END lat
-- Another function that I call to get the data
FROM gen.f_data('rep = 1 and usu= 65 and date >= ''2019-05-18''::timestamp AND date < ''2019-05-19''::timestamp') x
) as rep
Попытка воспроизвести его как функцию
CREATE OR REPLACE FUNCTION est.replicate()
RETURNS integer AS
$BODY$
DECLARE
_test integer;
BEGIN
WITH test AS(SELECT (
SELECT array_agg('{"id":' || rep || ','
'"id_ag":' || age ||
...})
FROM gen.ev_ag ea WHERE ea.id = 65 AND ea.id_r = x.id_r) AS eve,
(SELECT '{"fecha_registro":"' || fec_reg::date || '",
"es_vehiculo_movimiento":' || veh || ',
"tiempo_transcurrido":"' || tie_tra || '"}'
FROM gen.paradas_marcha pm WHERE pm.rep = x.rep GROUP BY rep, fec_reg::date, veh, tie_tra) AS par,
cal,
seg,
pan,
enc,
veh,
CASE
WHEN st_x(the_geom) is null then null
ELSE ROUND(st_x(the_geom)::numeric,6)
END lon,
CASE
WHEN st_y(the_geom) is null then null
ELSE ROUND(st_y(the_geom)::numeric,6)
END lat
FROM gen.f_data('rep = 1 and usu= 65 and date >= ''2019-05-18''::timestamp AND date < ''2019-05-19''::timestamp') x)
SELECT COUNT(*) INTO _test FROM test;
RETURN _test;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;