baz9

Badges

100 Contributions1,000 Contributions10 Posts

Contributions

Posts

1 Day

0

7 Days

145

4 Weeks

999

All Time

3553

Current Streak

3

Longest Streak

8

Top Contributions

Name Type # Changes Last Updated First Updated
1 https://www.instagram.com/p/DLG3qSwxRoF/ media 45 26th April 2026 8th April 2026
2 https://www.instagram.com/reel/DKttE1YNfkN/ media 39 9th April 2026 8th April 2026
3 https://www.instagram.com/reel/DFIq7X8NAIi/ media 36 29th March 2026 29th March 2026
4 Jordan Cannon climber 32 27th April 2026 23rd March 2026
5 Notable Queer Climbers list 32 27th April 2026 23rd March 2026
6 https://open.spotify.com/episode/5EREAaZGQcasxpoY6oDXor media 31 6th March 2026 4th February 2026
7 Chuck Odette climber 28 26th March 2026 25th March 2026
8 https://open.spotify.com/episode/5NHG7EfwMMQnphpUyAIm2Z media 28 27th March 2026 27th March 2026
9 Oldest Ascents (with date ranges) list 28 24th March 2026 23rd March 2026
10 Six Degrees climb 27 20th February 2026 20th November 2025

Recent Contributions

Date Time User Type Name Attribute
1701 24th March 2026 10:04:18 UTC baz9 climber Théo Blass date_of_birth_pretty
Before
After
Between 1st Nov 2009 and 15th Dec 2009
1702 24th March 2026 10:04:18 UTC baz9 climber Théo Blass age
Before
None
After
16
1703 24th March 2026 10:04:18 UTC baz9 climber Théo Blass date_of_birth_end
Before
None
After
2009-12-15
1704 24th March 2026 10:04:18 UTC baz9 climber Théo Blass date_of_birth_start
Before
None
After
2009-11-01
1705 24th March 2026 01:50:31 UTC baz9 list Oldest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,case when a.ascent_dt_end is not null then a.ascent_dt_end - c.date_of_birth_start else null end as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,case when a.ascent_dt_end is not null then extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer else null end as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.ascent_dt_end is null then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to n/a' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.ascent_dt_end is null then '✓' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,case when a.ascent_dt_end is not null then a.ascent_dt_end - c.date_of_birth_start else null end as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,case when a.ascent_dt_end is not null then extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer else null end as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum Age (days)" ,case when o.ascent_dt_end is null then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to n/a' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.ascent_dt_end is null then '✓' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -73,7 +73,7 @@

o.grade
,'' || o.climber_name || '' as "Climber"
,'' || o.climb_name || '' as "Climb"
- ,o.min_age_in_days_at_ascent as "Minimum age (days)"
+ ,o.min_age_in_days_at_ascent as "Minimum Age (days)"
,case
when o.ascent_dt_end is null then
o.min_age_in_years_at_ascent || ' years ' ||
1706 24th March 2026 01:50:13 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc nulls last ,a.ascent_dt_start - c.date_of_birth_end asc nulls last ,a.ascent_dt_start asc nulls last ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,case when a.ascent_dt_start is not null then a.ascent_dt_start - c.date_of_birth_end else null end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,case when a.ascent_dt_start is not null then extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer else null end as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.max_age_in_days_at_ascent as "Maximum possible age (days)" ,case when y.ascent_dt_start is null then 'n/a to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.ascent_dt_start is null then '✓' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc nulls last ,a.ascent_dt_start - c.date_of_birth_end asc nulls last ,a.ascent_dt_start asc nulls last ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,case when a.ascent_dt_start is not null then a.ascent_dt_start - c.date_of_birth_end else null end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,case when a.ascent_dt_start is not null then extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer else null end as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.max_age_in_days_at_ascent as "Maximum Age (days)" ,case when y.ascent_dt_start is null then 'n/a to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.ascent_dt_start is null then '✓' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
Diff
--- before

+++ after

@@ -76,7 +76,7 @@

y.grade
,'' || y.climber_name || '' as "Climber"
,'' || y.climb_name || '' as "Climb"
- ,y.max_age_in_days_at_ascent as "Maximum possible age (days)"
+ ,y.max_age_in_days_at_ascent as "Maximum Age (days)"
,case
when y.ascent_dt_start is null then
'n/a to ' ||
1707 24th March 2026 01:46:43 UTC baz9 list Youngest Ascents (with date ranges) list_description
Before
Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents) The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum* age of ascent. Ideally we want to source the exact dates for the ascents listed here.
After
Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents) The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers **maximum** age of ascent. Ideally we want to source the exact dates for the ascents listed here.
Diff
--- before

+++ after

@@ -1,3 +1,3 @@

Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents)

-The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum* age of ascent. Ideally we want to source the exact dates for the ascents listed here.
+The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers **maximum** age of ascent. Ideally we want to source the exact dates for the ascents listed here.
1708 24th March 2026 01:46:43 UTC baz9 list Youngest Ascents (with date ranges) list_description_pretty
Before
<p>Main list here: <a href="https://climbing-history.org/list/57/youngest-ascents" rel="noopener noreferrer">https://climbing-history.org/list/57/youngest-ascents</a></p> <p>The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers <em>maximum</em> age of ascent. Ideally we want to source the exact dates for the ascents listed here.</p>
After
<p>Main list here: <a href="https://climbing-history.org/list/57/youngest-ascents" rel="noopener noreferrer">https://climbing-history.org/list/57/youngest-ascents</a></p> <p>The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers <strong>maximum</strong> age of ascent. Ideally we want to source the exact dates for the ascents listed here.</p>
1709 24th March 2026 01:45:27 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc ,a.ascent_dt_start - c.date_of_birth_end asc ,a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.max_age_in_days_at_ascent as "Maximum possible age (days)" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc nulls last ,a.ascent_dt_start - c.date_of_birth_end asc nulls last ,a.ascent_dt_start asc nulls last ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,case when a.ascent_dt_start is not null then a.ascent_dt_start - c.date_of_birth_end else null end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,case when a.ascent_dt_start is not null then extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer else null end as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.max_age_in_days_at_ascent as "Maximum possible age (days)" ,case when y.ascent_dt_start is null then 'n/a to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.ascent_dt_start is null then '✓' when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
Diff
--- before

+++ after

@@ -17,9 +17,9 @@

row_number() over (
partition by g.grade_id
order by
- a.ascent_dt_end - c.date_of_birth_start asc
- ,a.ascent_dt_start - c.date_of_birth_end asc
- ,a.ascent_dt_start asc
+ a.ascent_dt_end - c.date_of_birth_start asc nulls last
+ ,a.ascent_dt_start - c.date_of_birth_end asc nulls last
+ ,a.ascent_dt_start asc nulls last
) as row_number
,c.climber_id
,c.climber_name
@@ -34,9 +34,15 @@

,a.ascent_dt_end
,c.date_of_birth_start
,c.date_of_birth_end
- ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent
+ ,case
+ when a.ascent_dt_start is not null then a.ascent_dt_start - c.date_of_birth_end
+ else null
+ end as min_age_in_days_at_ascent
,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent
- ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent
+ ,case
+ when a.ascent_dt_start is not null then extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer
+ else null
+ end as min_age_in_years_at_ascent
,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent

from
@@ -53,8 +59,7 @@

on a.ascent_style_id = ast.ascent_style_id

where
- a.ascent_dt_start is not null
- and a.ascent_dt_end is not null
+ a.ascent_dt_end is not null
and ast.ascent_successful = true
), youngest as (
select
@@ -73,6 +78,11 @@

,'' || y.climb_name || '' as "Climb"
,y.max_age_in_days_at_ascent as "Maximum possible age (days)"
,case
+ when y.ascent_dt_start is null then
+ 'n/a to ' ||
+ y.max_age_in_years_at_ascent || ' years ' ||
+ extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) ||
+ ' days'
when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then
y.min_age_in_years_at_ascent || ' years ' ||
extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) ||
@@ -86,6 +96,7 @@

' days'
end as "Age"
,case
+ when y.ascent_dt_start is null then '✓'
when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then ''
else '✓'
end as "Dates Needed"
1710 24th March 2026 01:39:26 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.min_age_in_days_at_ascent as "Minimum age (days)" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc ,a.ascent_dt_start - c.date_of_birth_end asc ,a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.max_age_in_days_at_ascent as "Maximum possible age (days)" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
Diff
--- before

+++ after

@@ -16,7 +16,10 @@

select
row_number() over (
partition by g.grade_id
- order by a.ascent_dt_start - c.date_of_birth_end asc, a.ascent_dt_start asc
+ order by
+ a.ascent_dt_end - c.date_of_birth_start asc
+ ,a.ascent_dt_start - c.date_of_birth_end asc
+ ,a.ascent_dt_start asc
) as row_number
,c.climber_id
,c.climber_name
@@ -68,7 +71,7 @@

y.grade
,'' || y.climber_name || '' as "Climber"
,'' || y.climb_name || '' as "Climb"
- ,y.min_age_in_days_at_ascent as "Minimum age (days)"
+ ,y.max_age_in_days_at_ascent as "Maximum possible age (days)"
,case
when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then
y.min_age_in_years_at_ascent || ' years ' ||
1711 24th March 2026 01:35:10 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.min_age_in_days_at_ascent as "Minimum age (days)" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days' else y.min_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) || ' days to ' || y.max_age_in_years_at_ascent || ' years ' || extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from youngest y where case when y.grade_system_id = 1 and y.order_on >= 13 then 1 when y.grade_system_id = 2 and y.order_on >= 60 then 1 when y.grade_system_id = 3 and y.order_on >= 37 then 1 else 0 end = 1 and y.climb_type_id in (1,2,3) order by y.grade_system_id ,y.order_on
Diff
--- before

+++ after

@@ -1,105 +1,105 @@

with climbers_with_dobs as (
- select
- c.climber_id
- ,c.climber_name
- ,c.date_of_birth_start
- ,c.date_of_birth_end
+ select
+ c.climber_id
+ ,c.climber_name
+ ,c.date_of_birth_start
+ ,c.date_of_birth_end

- from
- climbers c
+ from
+ climbers c

- where
- c.deleted_on is null
- and c.date_of_birth_start is not null
- and c.date_of_birth_end is not null
+ where
+ c.deleted_on is null
+ and c.date_of_birth_start is not null
+ and c.date_of_birth_end is not null
), ascents_with_ages as (
- select
- row_number() over (
- partition by g.grade_id
- order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc
- ) as row_number
- ,c.climber_id
- ,c.climber_name
- ,cl.climb_id
- ,cl.climb_name
- ,g.grade_id
- ,g.grade_system_id
- ,g.climb_type_id
- ,g.order_on
- ,g.grade
- ,a.ascent_dt_start
- ,a.ascent_dt_end
- ,c.date_of_birth_start
- ,c.date_of_birth_end
- ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent
- ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent
- ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent
- ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent
+ select
+ row_number() over (
+ partition by g.grade_id
+ order by a.ascent_dt_start - c.date_of_birth_end asc, a.ascent_dt_start asc
+ ) as row_number
+ ,c.climber_id
+ ,c.climber_name
+ ,cl.climb_id
+ ,cl.climb_name
+ ,g.grade_id
+ ,g.grade_system_id
+ ,g.climb_type_id
+ ,g.order_on
+ ,g.grade
+ ,a.ascent_dt_start
+ ,a.ascent_dt_end
+ ,c.date_of_birth_start
+ ,c.date_of_birth_end
+ ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent
+ ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent
+ ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent
+ ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent

- from
- ascents a
- inner join climbers_with_dobs c
- on a.climber_id = c.climber_id
- and a.deleted_on is null
- inner join climbs cl
- on cl.climb_id = a.climb_id
- and cl.deleted_on is null
- inner join grades g
- on cl.grade_id = g.grade_id
- inner join ascent_styles ast
- on a.ascent_style_id = ast.ascent_style_id
+ from
+ ascents a
+ inner join climbers_with_dobs c
+ on a.climber_id = c.climber_id
+ and a.deleted_on is null
+ inner join climbs cl
+ on cl.climb_id = a.climb_id
+ and cl.deleted_on is null
+ inner join grades g
+ on cl.grade_id = g.grade_id
+ inner join ascent_styles ast
+ on a.ascent_style_id = ast.ascent_style_id

- where
- a.ascent_dt_start is not null
- and a.ascent_dt_end is not null
- and ast.ascent_successful = true
-), oldest as (
- select
- *
+ where
+ a.ascent_dt_start is not null
+ and a.ascent_dt_end is not null
+ and ast.ascent_successful = true
+), youngest as (
+ select
+ *

- from
- ascents_with_ages
+ from
+ ascents_with_ages

- where
- row_number = 1
+ where
+ row_number = 1
)

select
- o.grade
- ,'' || o.climber_name || '' as "Climber"
- ,'' || o.climb_name || '' as "Climb"
- ,o.min_age_in_days_at_ascent as "Minimum age (days)"
- ,case
- when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then
- o.min_age_in_years_at_ascent || ' years ' ||
- extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) ||
- ' days'
- else
- o.min_age_in_years_at_ascent || ' years ' ||
- extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) ||
- ' days to ' ||
- o.max_age_in_years_at_ascent || ' years ' ||
- extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) ||
- ' days'
- end as "Age"
- ,case
- when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then ''
- else '✓'
- end as "Dates Needed"
+ y.grade
+ ,'' || y.climber_name || '' as "Climber"
+ ,'' || y.climb_name || '' as "Climb"
+ ,y.min_age_in_days_at_ascent as "Minimum age (days)"
+ ,case
+ when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then
+ y.min_age_in_years_at_ascent || ' years ' ||
+ extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) ||
+ ' days'
+ else
+ y.min_age_in_years_at_ascent || ' years ' ||
+ extract(days from y.ascent_dt_start - (y.date_of_birth_end + make_interval(years => y.min_age_in_years_at_ascent))) ||
+ ' days to ' ||
+ y.max_age_in_years_at_ascent || ' years ' ||
+ extract(days from y.ascent_dt_end - (y.date_of_birth_start + make_interval(years => y.max_age_in_years_at_ascent))) ||
+ ' days'
+ end as "Age"
+ ,case
+ when y.min_age_in_days_at_ascent = y.max_age_in_days_at_ascent then ''
+ else '✓'
+ end as "Dates Needed"

from
- oldest o
+ youngest y

where
- case
- when o.grade_system_id = 1 and o.order_on >= 13 then 1
- when o.grade_system_id = 2 and o.order_on >= 60 then 1
- when o.grade_system_id = 3 and o.order_on >= 37 then 1
- else 0
- end = 1
- and o.climb_type_id in (1,2,3)
+ case
+ when y.grade_system_id = 1 and y.order_on >= 13 then 1
+ when y.grade_system_id = 2 and y.order_on >= 60 then 1
+ when y.grade_system_id = 3 and y.order_on >= 37 then 1
+ else 0
+ end = 1
+ and y.climb_type_id in (1,2,3)

order by
- o.grade_system_id
- ,o.order_on
+ y.grade_system_id
+ ,y.order_on

1712 24th March 2026 01:32:42 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Maximum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -68,7 +68,7 @@

o.grade
,'' || o.climber_name || '' as "Climber"
,'' || o.climb_name || '' as "Climb"
- ,o.min_age_in_days_at_ascent as "Maximum age (days)"
+ ,o.min_age_in_days_at_ascent as "Minimum age (days)"
,case
when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then
o.min_age_in_years_at_ascent || ' years ' ||
1713 24th March 2026 01:30:10 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Maximum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -68,7 +68,7 @@

o.grade
,'' || o.climber_name || '' as "Climber"
,'' || o.climb_name || '' as "Climb"
- ,o.min_age_in_days_at_ascent as "Minimum age (days)"
+ ,o.min_age_in_days_at_ascent as "Maximum age (days)"
,case
when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then
o.min_age_in_years_at_ascent || ' years ' ||
1714 24th March 2026 01:28:47 UTC baz9 list Oldest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,case when a.ascent_dt_end is not null then a.ascent_dt_end - c.date_of_birth_start else null end as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,case when a.ascent_dt_end is not null then extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer else null end as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.ascent_dt_end is null then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to n/a' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.ascent_dt_end is null then '✓' when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -32,9 +32,15 @@

,c.date_of_birth_start
,c.date_of_birth_end
,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent
- ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent
+ ,case
+ when a.ascent_dt_end is not null then a.ascent_dt_end - c.date_of_birth_start
+ else null
+ end as max_age_in_days_at_ascent
,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent
- ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent
+ ,case
+ when a.ascent_dt_end is not null then extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer
+ else null
+ end as max_age_in_years_at_ascent

from
ascents a
@@ -51,7 +57,6 @@


where
a.ascent_dt_start is not null
- and a.ascent_dt_end is not null
and ast.ascent_successful = true
), oldest as (
select
@@ -70,6 +75,10 @@

,'' || o.climb_name || '' as "Climb"
,o.min_age_in_days_at_ascent as "Minimum age (days)"
,case
+ when o.ascent_dt_end is null then
+ o.min_age_in_years_at_ascent || ' years ' ||
+ extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) ||
+ ' days to n/a'
when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then
o.min_age_in_years_at_ascent || ' years ' ||
extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) ||
@@ -83,6 +92,7 @@

' days'
end as "Age"
,case
+ when o.ascent_dt_end is null then '✓'
when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then ''
else '✓'
end as "Dates Needed"
1715 24th March 2026 01:09:10 UTC baz9 list Oldest Ascents list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start as date_of_birth from climbers c where c.deleted_on is null and c.date_of_birth_start = c.date_of_birth_end ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,c.date_of_birth ,a.ascent_dt_start - c.date_of_birth as age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth))::integer as age_in_years_at_ascent ,age(a.ascent_dt_start, c.date_of_birth) as age_interval_at_ascent ,a.ascent_id from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id where a.ascent_dt_start = a.ascent_dt_end ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.age_in_days_at_ascent as "Age (Days)" ,o.age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth + make_interval(years => o.age_in_years_at_ascent))) || ' days' as "Age" from oldest o where case when grade_system_id = 1 and order_on >= 13 then 1 when grade_system_id = 2 and order_on >= 60 then 1 when grade_system_id = 3 and order_on >= 37 then 1 else 0 end = 1 and climb_type_id in (1,2,3) order by grade_system_id ,order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start as date_of_birth from climbers c where c.deleted_on is null and c.date_of_birth_start = c.date_of_birth_end ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,c.date_of_birth ,a.ascent_dt_start - c.date_of_birth as age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth))::integer as age_in_years_at_ascent ,age(a.ascent_dt_start, c.date_of_birth) as age_interval_at_ascent ,a.ascent_id from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start = a.ascent_dt_end and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.age_in_days_at_ascent as "Age (Days)" ,o.age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth + make_interval(years => o.age_in_years_at_ascent))) || ' days' as "Age" from oldest o where case when grade_system_id = 1 and order_on >= 13 then 1 when grade_system_id = 2 and order_on >= 60 then 1 when grade_system_id = 3 and order_on >= 37 then 1 else 0 end = 1 and climb_type_id in (1,2,3) order by grade_system_id ,order_on
Diff
--- before

+++ after

@@ -42,9 +42,12 @@

and cl.deleted_on is null
inner join grades g
on cl.grade_id = g.grade_id
+ inner join ascent_styles ast
+ on a.ascent_style_id = ast.ascent_style_id

where
a.ascent_dt_start = a.ascent_dt_end
+ and ast.ascent_successful = true

), oldest as (
select
1716 24th March 2026 01:07:16 UTC baz9 list Youngest Ascents list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start as date_of_birth from climbers c where c.deleted_on is null and c.date_of_birth_start = c.date_of_birth_end ), ascents_with_ages as ( select row_number() over (partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth asc, a.ascent_dt_start asc) as row_number, c.climber_id, c.climber_name, cl.climb_id, cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,c.date_of_birth ,a.ascent_dt_start - c.date_of_birth as age_in_days_at_ascent ,EXTRACT(YEAR FROM age(a.ascent_dt_start, c.date_of_birth))::integer AS age_in_years_at_ascent ,age(a.ascent_dt_start, c.date_of_birth) as age_interval_at_ascent ,a.ascent_id from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id where a.ascent_dt_start = a.ascent_dt_end ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.age_in_days_at_ascent as "Age (Days)" ,y.age_in_years_at_ascent || ' years ' || extract(days FROM y.ascent_dt_start - (y.date_of_birth + make_interval(years => y.age_in_years_at_ascent))) || ' days' AS "Age" from youngest y where case when grade_system_id = 1 and order_on >= 13 then 1 -- sport when grade_system_id = 2 and order_on >= 60 then 1 -- trad when grade_system_id = 3 and order_on >= 37 then 1 -- boulder else 0 end = 1 and climb_type_id in (1,2,3) order by grade_system_id ,order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start as date_of_birth from climbers c where c.deleted_on is null and c.date_of_birth_start = c.date_of_birth_end ), ascents_with_ages as ( select row_number() over (partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth asc, a.ascent_dt_start asc) as row_number, c.climber_id, c.climber_name, cl.climb_id, cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,c.date_of_birth ,a.ascent_dt_start - c.date_of_birth as age_in_days_at_ascent ,EXTRACT(YEAR FROM age(a.ascent_dt_start, c.date_of_birth))::integer AS age_in_years_at_ascent ,age(a.ascent_dt_start, c.date_of_birth) as age_interval_at_ascent ,a.ascent_id from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start = a.ascent_dt_end and ast.ascent_successful = true ), youngest as ( select * from ascents_with_ages where row_number = 1 ) select y.grade ,'<a href="/climber/' || y.climber_id::varchar || '">' || y.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || y.climb_id::varchar || '">' || y.climb_name || '</a>' as "Climb" ,y.age_in_days_at_ascent as "Age (Days)" ,y.age_in_years_at_ascent || ' years ' || extract(days FROM y.ascent_dt_start - (y.date_of_birth + make_interval(years => y.age_in_years_at_ascent))) || ' days' AS "Age" from youngest y where case when grade_system_id = 1 and order_on >= 13 then 1 -- sport when grade_system_id = 2 and order_on >= 60 then 1 -- trad when grade_system_id = 3 and order_on >= 37 then 1 -- boulder else 0 end = 1 and climb_type_id in (1,2,3) order by grade_system_id ,order_on
Diff
--- before

+++ after

@@ -39,9 +39,12 @@

and cl.deleted_on is null
inner join grades g
on cl.grade_id = g.grade_id
+ inner join ascent_styles ast
+ on a.ascent_style_id = ast.ascent_style_id

where
a.ascent_dt_start = a.ascent_dt_end
+ and ast.ascent_successful = true

), youngest as (
select *
@@ -70,4 +73,5 @@


order by
grade_system_id
- ,order_on
+ ,order_on
+
1717 24th March 2026 01:01:10 UTC baz9 list Oldest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_start - c.date_of_birth_end desc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -46,10 +46,13 @@

and cl.deleted_on is null
inner join grades g
on cl.grade_id = g.grade_id
+ inner join ascent_styles ast
+ on a.ascent_style_id = ast.ascent_style_id

where
a.ascent_dt_start is not null
and a.ascent_dt_end is not null
+ and ast.ascent_successful = true
), oldest as (
select
*
1718 24th March 2026 00:59:35 UTC baz9 list Youngest Ascents (with date ranges) list_definition
Before
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
After
with climbers_with_dobs as ( select c.climber_id ,c.climber_name ,c.date_of_birth_start ,c.date_of_birth_end from climbers c where c.deleted_on is null and c.date_of_birth_start is not null and c.date_of_birth_end is not null ), ascents_with_ages as ( select row_number() over ( partition by g.grade_id order by a.ascent_dt_end - c.date_of_birth_start asc, a.ascent_dt_start asc ) as row_number ,c.climber_id ,c.climber_name ,cl.climb_id ,cl.climb_name ,g.grade_id ,g.grade_system_id ,g.climb_type_id ,g.order_on ,g.grade ,a.ascent_dt_start ,a.ascent_dt_end ,c.date_of_birth_start ,c.date_of_birth_end ,a.ascent_dt_start - c.date_of_birth_end as min_age_in_days_at_ascent ,a.ascent_dt_end - c.date_of_birth_start as max_age_in_days_at_ascent ,extract(year from age(a.ascent_dt_start, c.date_of_birth_end))::integer as min_age_in_years_at_ascent ,extract(year from age(a.ascent_dt_end, c.date_of_birth_start))::integer as max_age_in_years_at_ascent from ascents a inner join climbers_with_dobs c on a.climber_id = c.climber_id and a.deleted_on is null inner join climbs cl on cl.climb_id = a.climb_id and cl.deleted_on is null inner join grades g on cl.grade_id = g.grade_id inner join ascent_styles ast on a.ascent_style_id = ast.ascent_style_id where a.ascent_dt_start is not null and a.ascent_dt_end is not null and ast.ascent_successful = true ), oldest as ( select * from ascents_with_ages where row_number = 1 ) select o.grade ,'<a href="/climber/' || o.climber_id::varchar || '">' || o.climber_name || '</a>' as "Climber" ,'<a href="/climb/' || o.climb_id::varchar || '">' || o.climb_name || '</a>' as "Climb" ,o.min_age_in_days_at_ascent as "Minimum age (days)" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days' else o.min_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_start - (o.date_of_birth_end + make_interval(years => o.min_age_in_years_at_ascent))) || ' days to ' || o.max_age_in_years_at_ascent || ' years ' || extract(days from o.ascent_dt_end - (o.date_of_birth_start + make_interval(years => o.max_age_in_years_at_ascent))) || ' days' end as "Age" ,case when o.min_age_in_days_at_ascent = o.max_age_in_days_at_ascent then '' else '✓' end as "Dates Needed" from oldest o where case when o.grade_system_id = 1 and o.order_on >= 13 then 1 when o.grade_system_id = 2 and o.order_on >= 60 then 1 when o.grade_system_id = 3 and o.order_on >= 37 then 1 else 0 end = 1 and o.climb_type_id in (1,2,3) order by o.grade_system_id ,o.order_on
Diff
--- before

+++ after

@@ -46,10 +46,13 @@

and cl.deleted_on is null
inner join grades g
on cl.grade_id = g.grade_id
+ inner join ascent_styles ast
+ on a.ascent_style_id = ast.ascent_style_id

where
a.ascent_dt_start is not null
and a.ascent_dt_end is not null
+ and ast.ascent_successful = true
), oldest as (
select
*
1719 24th March 2026 00:53:55 UTC baz9 list Youngest Ascents (with date ranges) list_description
Before
Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents) The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum possible age of ascent* based on the data we have. Ideally we want to source the exact dates for the ascents listed here.
After
Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents) The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum* age of ascent. Ideally we want to source the exact dates for the ascents listed here.
Diff
--- before

+++ after

@@ -1,3 +1,3 @@

Main list here: [https://climbing-history.org/list/57/youngest-ascents](https://climbing-history.org/list/57/youngest-ascents)

-The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum possible age of ascent* based on the data we have. Ideally we want to source the exact dates for the ascents listed here.
+The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers *maximum* age of ascent. Ideally we want to source the exact dates for the ascents listed here.
1720 24th March 2026 00:53:55 UTC baz9 list Youngest Ascents (with date ranges) list_description_pretty
Before
<p>Main list here: <a href="https://climbing-history.org/list/57/youngest-ascents" rel="noopener noreferrer">https://climbing-history.org/list/57/youngest-ascents</a></p> <p>The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers <em>maximum possible age of ascent</em> based on the data we have. Ideally we want to source the exact dates for the ascents listed here.</p>
After
<p>Main list here: <a href="https://climbing-history.org/list/57/youngest-ascents" rel="noopener noreferrer">https://climbing-history.org/list/57/youngest-ascents</a></p> <p>The above list will only show an ascent where we can calculate a climbers exact age at time of ascent. This list instead calculates the range of possible ages and sorts based on the climbers <em>maximum</em> age of ascent. Ideally we want to source the exact dates for the ascents listed here.</p>

< Page 86 >