Here is my function:
CREATE OR REPLACE FUNCTION get_separated_teams(dates date[])
RETURNS TABLE(
team_a_imei TEXT,
team_b_imei TEXT,
report_date DATE,
Province TEXT,
District TEXT,
Tehsil TEXT,
Uc TEXT,
count_distinct_a_ping_time INT
) AS $$
DECLARE
d DATE;
BEGIN
FOREACH d IN ARRAY dates LOOP
RETURN QUERY
WITH
dep_rep AS (
SELECT report -> 'details' AS details
FROM campaign_deployment_reporting cdr
),
format_dep_rep AS (
SELECT json_array_elements(details)::json AS first_element
FROM dep_rep
),
inter_report AS (
SELECT
first_element::jsonb->>'IMEI' AS imei,
first_element::jsonb->>'ReportingStart' AS reporting_start,
first_element::jsonb->>'ReportingEnd' AS reporting_end,
first_element::jsonb->>'Date' AS report_date,
first_element::jsonb->>'Province' AS Province,
first_element::jsonb->>'District' AS District,
first_element::jsonb->>'Tehsil' AS Tehsil,
first_element::jsonb->>'Uc' AS Uc
FROM format_dep_rep
),
final_report AS (
SELECT DISTINCT imei,
reporting_start::timestamp,
reporting_end::timestamp,
report_date::date AS report_date,
Province,
District,
Tehsil,
Uc
FROM inter_report
WHERE report_date::date = d
),
pings AS MATERIALIZED (
SELECT
u.imei AS team_a_imei,
a.imei AS team_b_imei,
u.t + interval '5 hours' AS a_ping_time,
a.t + interval '5 hours' AS b_ping_time
FROM (
SELECT
p.imei,
st_transform(p.geoJson, 32643) AS geom,
generatedAt AS t,
p.ID AS u_ping_id
FROM campaign_pings p
WHERE generatedAt + interval '5 hours' BETWEEN d::timestamp + interval '06:00:00' AND d::timestamp + interval '18:00:00'
) u
LEFT JOIN (
SELECT
p.imei,
p.ID AS a_ping_id,
st_transform(p.geoJson, 32643) AS geom,
generatedAt AS t
FROM campaign_pings p
WHERE generatedAt + interval '5 hours' BETWEEN d::timestamp + interval '06:00:00' AND d::timestamp + interval '18:00:00'
) a
ON NOT ST_DWithin(u.geom, a.geom, 300)
AND a.t BETWEEN u.t - INTERVAL '30 seconds' AND u.t + INTERVAL '30 seconds'
WHERE a.imei IS NOT NULL
AND (u.imei, a.imei) IN (SELECT team_a_imei, team_b_imei FROM separation_table)
),
filters AS (
SELECT
p.*,
fr.Province,
fr.District,
fr.Tehsil,
fr.Uc,
fr.reporting_start AS reporting_start_a,
fr.reporting_end AS reporting_end_a,
fr1.reporting_start AS reporting_start_b,
fr1.reporting_end AS reporting_end_b,
fr.report_date
FROM pings p
LEFT JOIN final_report fr ON fr.report_date = p.a_ping_time::date AND fr.imei = p.team_a_imei
LEFT JOIN final_report fr1 ON fr1.report_date = p.b_ping_time::date AND fr1.imei = p.team_b_imei
WHERE (
fr.reporting_start IS NOT NULL
AND fr.reporting_end IS NOT NULL
AND fr1.reporting_start IS NOT NULL
AND fr1.reporting_end IS NOT NULL
AND p.a_ping_time BETWEEN GREATEST(fr.reporting_start, fr1.reporting_start) AND LEAST(fr.reporting_end, fr1.reporting_end)
)
)
SELECT
filters.team_a_imei,
filters.team_b_imei,
filters.report_date,
filters.Province,
filters.District,
filters.Tehsil,
filters.Uc,
COUNT(DISTINCT filters.a_ping_time) AS count_distinct_a_ping_time
FROM filters
GROUP BY 1, 2, 3, 4, 5, 6, 7
HAVING COUNT(*) > 30;
END LOOP;
END;
$$ LANGUAGE plpgsql;
When I call it using:
SELECT * FROM get_separated_teams(ARRAY['2024-04-30'::date,'2024-05-01'::date]);
I get the following error:
SQL Error [42702]: ERROR: column reference "report_date" is ambiguous
Detail: It could refer to either a PL/pgSQL variable or a table column.
Where: PL/pgSQL function get_separated_teams(date[]) line 6 at RETURN QUERY
Do i have to change something in the final select clause? I really do not know what more details to add, yet this website is forcing me to add more details. Can someone please let me know if I have defined the function correctly? It seems like the website still is not accepting. It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.It seems like the website still is not accepting.