У меня есть в базе данных такие данные, как это
61/10#61/12,0/12,10/16,0/21,0/12#61/33,0/28#0/34,0/23#0/28
, где такая часть, как 10/16
(без #
) недопустима, не должна использоваться для расчета,
, но вседругой имеет следующий формат min_hr + "/" + min_hrv + "#" + max_hr + "/" + max_hrv
, и проблема заключается в том, чтобы получить значение AVG по следующей формуле псевдо [ summ(all(min_hrv)) + summ(all(max_hrv)) ] / count(all(min_hrv)) + all(max_hrv))
, для результата строки примера будет ((10 + 12 + 28 + 23) + (12 + 33 + 34 + 28))/8)
== 22
Чтоя пытаюсь это:
SELECT regexp_replace(
'61/10#61/12,0/12,10/16,0/21,0/12#61/33,0/28#0/34,0/23#0/28',
',\d+/\d+,', ',',
'g'
);
, чтобы удалить недопустимые данные, но 10/16
все еще в строке, результат:
regexp_replace
--------------------------------------------------
61/10#61/12,10/16,0/12#61/33,0/28#0/34,0/23#0/28
, если хорошо очистить строку, мой план будет разделен на массивкак-то так, для max (не полное решение, имеет пустую строку), не имеет решения для min:
SELECT
regexp_split_to_array(
regexp_replace(
'61/10#61/12,0/12,0/12#61/33,0/28#0/34,0/23#0/28',
',\d+/\d+,', ',',
'g'
)
,',?\d+/\d+#\d+/'
);
результат:
regexp_split_to_array
-----------------------
{"",12,33,34,28}
и затем вычислить данные,что-то вроде этого:
SELECT ((
SELECT sum(tmin.unnest)
FROM
(SELECT unnest('{10,12,28,23}'::int[])) as tmin
)
+
(
SELECT sum(tmax.unnest)
FROM
(SELECT unnest('{12,33,34,28}'::int[])) as tmax
))
/
(SELECT array_length('{12,33,34,28}'::int[], 1) * 2)
может кто-нибудь знает более простой и правильный способ решения такой проблемы?