A daily snapshot of the Open-Meteo weather forecast for a fixed panel of eight major world cities: temperature, precipitation, wind, UV and sunrise/sunset for every day of the forecast horizon, recorded as of the day it was published. Because each run keeps what was forecast on that day, the series can be used to study how forecasts change as the target day approaches.
All three stay inside Daily city weather forecasts: the assistant is given this dataset’s schema and nothing else, and the playground attaches only these tables. Ask across every dataset from the home page instead.
Generated from this exact manifest version, so the URLs are the ones actually published.
Fastest — Parquet exports (immutable, sorted)
INSTALL httpfs; LOAD httpfs;
CREATE OR REPLACE VIEW daily_weather AS
SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/daily_weather.parquet');
CREATE OR REPLACE VIEW cities AS
SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/cities.parquet');
SELECT * FROM daily_weather LIMIT 10;
Live lake — DuckLake catalog, time travel included
INSTALL ducklake; LOAD ducklake;
ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/open-meteo-daily/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.daily_weather LIMIT 5;
USE lake;
Worked examples
Today’s forecast for every city
SELECT c.name, w.forecast_date, w.temperature_min, w.temperature_max, w.precipitation_sum
FROM daily_weather w
JOIN cities c USING (city_id)
WHERE w.snapshot_date = (SELECT max(snapshot_date) FROM daily_weather)
AND w.lead_days = 0
ORDER BY w.temperature_max DESC;
Joins the fact table to the dimension. The snapshot_date range is what prunes: it is the leading sort column.
How the forecast for one day drifted as it got closer
SELECT w.snapshot_date, w.lead_days, w.temperature_max
FROM daily_weather w
JOIN cities c USING (city_id)
WHERE c.name_lc = 'tokyo'
AND w.forecast_date = DATE '2026-08-28'
ORDER BY w.lead_days DESC;
Every run keeps its own view of the future, so a single forecast_date has one row per lead time.
Wettest city of each run day
SELECT w.snapshot_date, c.name, sum(w.precipitation_sum) AS mm
FROM daily_weather w JOIN cities c USING (city_id)
GROUP BY 1, 2 QUALIFY row_number() OVER (PARTITION BY w.snapshot_date ORDER BY mm DESC) = 1
ORDER BY 1 DESC;
One row per city per forecast day, as of the run day. A full daily snapshot of the forecast horizon: re-running a day rewrites exactly that day for exactly those cities, so the history of what was forecast when is preserved and comparable.
Rows
56
Size
5.4 KB
Write mode
snapshot_history
Sorted by
snapshot_datecity_idforecast_date
Files
1
Columns of daily_weather
Column
Type
Null
Description
Min
Max
snapshot_datesort
DATE
no
The run day (UTC) this forecast was captured on.
2026-08-22
2026-08-22
city_idsort
INTEGER
no
Our stable id for the city; joins to cities.city_id.
1
8
forecast_datesort
DATE
no
The day (UTC) this row describes.
2026-08-22
2026-08-28
lead_days
INTEGER (days)
no
forecast_date minus snapshot_date, in whole days. 0 is today, 1 is tomorrow. Lets you compare a forecast against the same day observed later.
—
—
weather_code
INTEGER
yes
WMO 4677 weather code for the day (0 clear … 95+ thunderstorm).
—
—
temperature_max
DOUBLE (°C)
yes
Highest 2 m air temperature of the day.
—
—
temperature_min
DOUBLE (°C)
yes
Lowest 2 m air temperature of the day.
—
—
temperature_mean
DOUBLE (°C)
yes
Mean 2 m air temperature of the day.
—
—
precipitation_sum
DOUBLE (mm)
yes
Total precipitation (rain + showers + snow water equivalent).
—
—
rain_sum
DOUBLE (mm)
yes
Rain only, excluding snow.
—
—
snowfall_sum
DOUBLE (cm)
yes
Snowfall, as fresh snow depth rather than water equivalent.
—
—
precipitation_hours
DOUBLE (h)
yes
Hours of the day with measurable precipitation.
—
—
wind_speed_max
DOUBLE (km/h)
yes
Highest 10 m wind speed of the day.
—
—
wind_gusts_max
DOUBLE (km/h)
yes
Highest 10 m wind gust of the day.
—
—
wind_direction_dominant
INTEGER (°)
yes
Dominant 10 m wind direction, meteorological convention (0 = from the north, 90 = from the east). Rounded to whole degrees.
—
—
uv_index_max
DOUBLE
yes
Highest UV index of the day.
—
—
sunrise
TIMESTAMPTZ
yes
Sunrise instant. The request pins timezone=UTC, so the naive local time the API returns is UTC and is stored as such.
—
—
sunset
TIMESTAMPTZ
yes
Sunset instant, on the same UTC basis as sunrise.
—
—
ingested_at
TIMESTAMP
no
When this row was produced by the ingest run (UTC).
The fixed panel of cities the forecast is collected for: our own stable id, the requested city-centre coordinates, and the model grid point Open-Meteo actually answered from. Reference data with no history — every run replaces it wholesale.
Rows
8
Size
2.1 KB
Write mode
replace
Sorted by
city_id
Files
1
Columns of cities
Column
Type
Null
Description
Min
Max
city_idsort
INTEGER
no
Stable id of the city. Ours, not Open-Meteo’s; never reused.
1
8
name
VARCHAR
no
City name as displayed.
—
—
name_lc
VARCHAR
no
name, lowercased and accent-folded. The prefix-search column — “sao paulo” must find “São Paulo”.
—
—
country
VARCHAR
no
Country name as displayed.
—
—
country_code
VARCHAR
no
ISO 3166-1 alpha-2 country code.
—
—
latitude
DOUBLE (°)
no
Requested city-centre latitude (WGS84).
—
—
longitude
DOUBLE (°)
no
Requested city-centre longitude (WGS84).
—
—
grid_latitude
DOUBLE (°)
yes
Latitude of the model grid cell Open-Meteo actually answered from. NULL when the last run could not read it.
—
—
grid_longitude
DOUBLE (°)
yes
Longitude of the model grid cell that answered.
—
—
elevation
DOUBLE (m)
yes
Elevation of the grid cell above sea level.
—
—
timezone
VARCHAR
yes
Timezone the API reported for the answer. Always UTC/GMT here.