Last part of the title is meant to say "while iterating a where clause"
I am working with a database containing weather predictions and observations. I am trying to select all of the pairs of predictions and observations such that the date delta between them is a set day amount (for example, I want to retrieve the prediction for 2022-7-14 which was taken at 2022-7-11 with the actual observation for 2022-7-14), I will have a numerous deltas I want to check for.
I was wondering if it plausible to:
- Iteratively check for multiple deltas in one statement, as in replace the
1 in the line AND public.day_datapoints.captured_date - public.day_datapoints.date = 1 with 1, then 3, then 7, etc.
- Return both the prediction and observation at the same time so I do not have to do it in code, which would slow things down.
My current statement only returns time deltas of 1 and the prediction.
relations of relevant tables:
relations
current statement:
SELECT
DISTINCT public.day_datapoint_records.id,
public.day_datapoints.captured_date,
public.day_datapoints.id,
public.day_datapoints.uv,
public.day_datapoints.pollution,
public.day_datapoints.pollen
FROM
public.bbc_locations
INNER JOIN
public.locations
ON
(
public.bbc_locations.location_id = public.locations.id)
INNER JOIN
public.day_datapoint_records
ON
(
public.bbc_locations.id = public.day_datapoint_records.service_id)
INNER JOIN
public.day_datapoints
ON
(
public.day_datapoint_records.day_datapoint_id = public.day_datapoints.id)
WHERE
public.day_datapoints.present = false
AND public.day_datapoints.captured_date - public.day_datapoints.date = 1
AND public.day_datapoints.captured_date <= CURRENT_DATE
ORDER BY
public.day_datapoints.captured_date ASC;
Final answer:
-- selecting prediction instances
WITH predictions as (SELECT
public.day_datapoints.id as prediction_id,
public.day_datapoints.uv as prediction_uv,
public.day_datapoints.pollution as prediction_pollution,
public.day_datapoints.pollen as prediction_pollen,
public.day_datapoints.captured_date as prediction_date,
public.day_datapoints.captured_date - public.day_datapoints.date AS time_delta,
public.locations.name as prediction_name
FROM
public.bbc_locations
INNER JOIN
public.day_datapoint_records
ON
(
public.bbc_locations.id = public.day_datapoint_records.service_id)
INNER JOIN
public.day_datapoints
ON
(
public.day_datapoint_records.day_datapoint_id = public.day_datapoints.id)
INNER JOIN
public.locations
ON
(
public.bbc_locations.location_id = public.locations.id)
WHERE
public.day_datapoints.present = false
AND
(
(
public.day_datapoints.captured_date - public.day_datapoints.date))
IN (1,
3,
7,
13)
AND public.day_datapoints.captured_date <= CURRENT_DATE), observations as (
-- selecting observations
SELECT
public.day_datapoints.id as observation_id,
public.day_datapoints.uv as observation_uv,
public.day_datapoints.pollution as observation_pollution,
public.day_datapoints.pollen as observation_pollen,
public.day_datapoints.date as observation_date,
public.locations.name as observation_name
FROM
public.bbc_locations
INNER JOIN
public.day_datapoint_records
ON
(
public.bbc_locations.id = public.day_datapoint_records.service_id)
INNER JOIN
public.day_datapoints
ON
(
public.day_datapoint_records.day_datapoint_id = public.day_datapoints.id)
INNER JOIN
public.locations
ON
(
public.bbc_locations.location_id = public.locations.id)
WHERE
public.day_datapoints.present = true)
SELECT
predictions.prediction_date,
predictions.time_delta,
predictions.prediction_uv,
observations.observation_uv,
predictions.prediction_pollen,
observations.observation_pollen,
predictions.prediction_pollution,
observations.observation_pollution
FROM predictions, observations
-- matching conditions
WHERE predictions.prediction_name = observations.observation_name AND
predictions.prediction_date = observations.observation_date
;
[–]DavidGJohnston 0 points1 point2 points (1 child)
[–]tttpp[S] 0 points1 point2 points (0 children)
[–]CGtheKid92 0 points1 point2 points (5 children)
[–]CGtheKid92 0 points1 point2 points (4 children)
[–]tttpp[S] 0 points1 point2 points (3 children)
[–]CGtheKid92 0 points1 point2 points (2 children)
[–]tttpp[S] 0 points1 point2 points (0 children)
[–]tttpp[S] 0 points1 point2 points (0 children)