Question: I get the following error: SQL Error [ 4 2 7 0 2 ] : ERROR: column reference report _ date is ambiguous Detail: It

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. ---------------------- 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;

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!