feat: ✨ add folder for related SQL snippets
This commit is contained in:
parent
2e74de359c
commit
c962aa2cdf
1 changed files with 89 additions and 0 deletions
89
lib/timeseries/hoarder/sql/manyagg.sql
Normal file
89
lib/timeseries/hoarder/sql/manyagg.sql
Normal file
|
@ -0,0 +1,89 @@
|
|||
CREATE OR REPLACE FUNCTION public.aggregate_autoselect(
|
||||
root_table character varying,
|
||||
data_interval interval,
|
||||
filter_query character varying,
|
||||
agg_pairs jsonb,
|
||||
metric_statement character varying DEFAULT 'tags',
|
||||
agg_basename character varying DEFAULT NULL,
|
||||
agg_schema character varying DEFAULT 'public',
|
||||
time_column character varying DEFAULT 'time')
|
||||
RETURNS SETOF RECORD
|
||||
LANGUAGE 'plpgsql'
|
||||
STABLE
|
||||
PARALLEL SAFE
|
||||
AS $BODY$
|
||||
DECLARE
|
||||
selected_table record;
|
||||
|
||||
selected_column character varying;
|
||||
selected_aggregator character varying;
|
||||
BEGIN
|
||||
agg_basename := coalesce(agg_basename, root_table);
|
||||
|
||||
WITH table_selection AS (
|
||||
SELECT table_name, column_name,
|
||||
coalesce(substring(table_name, agg_basename || '_\"%\"', '\'), '0')::interval AS table_interval
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema=agg_schema
|
||||
AND ((table_name = root_table) OR (table_name LIKE (agg_basename || '_%')))
|
||||
AND agg_pairs?column_name
|
||||
)
|
||||
SELECT table_name, column_name
|
||||
INTO selected_table
|
||||
FROM table_selection
|
||||
WHERE table_interval <= data_interval
|
||||
ORDER BY table_interval DESC
|
||||
LIMIT 1;
|
||||
|
||||
IF NOT FOUND THEN
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
selected_aggregator := agg_pairs->>selected_table.column_name;
|
||||
|
||||
RAISE NOTICE 'Using table %, column %, aggreagtor %', selected_table.table_name, selected_table.column_name, selected_aggregator;
|
||||
|
||||
RETURN QUERY EXECUTE format($qry$
|
||||
SELECT time_bucket($1, %I::timestamptz) AS time, (%s)::text AS metric, (%s) AS "value"
|
||||
FROM %I.%I
|
||||
WHERE %s
|
||||
GROUP BY 1, (%s)::text
|
||||
ORDER BY time
|
||||
$qry$, time_column, metric_statement, selected_aggregator,
|
||||
agg_schema, selected_table.table_name,
|
||||
filter_query,
|
||||
metric_statement)
|
||||
USING data_interval;
|
||||
END;
|
||||
$BODY$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.percentile_autoselect(
|
||||
root_table character varying,
|
||||
data_interval interval,
|
||||
percentiles double precision[],
|
||||
filter_query text,
|
||||
metric_statement character varying DEFAULT 'tags',
|
||||
agg_basename character varying DEFAULT NULL,
|
||||
agg_schema character varying DEFAULT 'public',
|
||||
time_column character varying DEFAULT 'time')
|
||||
RETURNS TABLE ("time" TIMESTAMPTZ, "metric" TEXT, "percentile" DOUBLE PRECISION, "value" DOUBLE PRECISION)
|
||||
LANGUAGE 'plpgsql'
|
||||
STABLE
|
||||
PARALLEL SAFE
|
||||
AS $body$
|
||||
DECLARE
|
||||
BEGIN
|
||||
|
||||
RETURN QUERY
|
||||
WITH ts_data AS (
|
||||
SELECT * FROM aggregate_autoselect(root_table, data_interval, filter_query,
|
||||
$${"value": "tdigest(10, value)", "tdigest": "rollup(tdigest)"}$$::jsonb,
|
||||
metric_statement, agg_basename, agg_schema, time_column)
|
||||
r("time" TIMESTAMPTZ, metric TEXT, value tdigest)
|
||||
)
|
||||
SELECT ts_data."time", ts_data.metric, up.percentile, approx_percentile(up.percentile, ts_data.value) AS "value"
|
||||
FROM ts_data
|
||||
CROSS JOIN unnest(percentiles) AS up(percentile)
|
||||
ORDER BY ts_data."time";
|
||||
END;
|
||||
$body$;
|
Loading…
Add table
Add a link
Reference in a new issue