Indicator coverage summary
Atlas view
Indicator coverage summary
api_v1.indicator_summaryOne row per indicator and source: latest year, kommune coverage and value range.
First 5 rows ·
api_v1.indicator_summarysnapshot 2026-05-12
| source_id | contents_code | contents_label | latest_year | kommuner_with_value | kommuner_with_null | min_value | max_value | upstream_updated |
|---|---|---|---|---|---|---|---|---|
| fhi-bor-alene | RATE | Andel (prosent) | 2025 | 357 | 0 | 14.7781128823783 | 35.7101449275362 | 2026-05-06T14:33:01.602+00:00 |
| fhi-bor-alene | SMR | Standardisert rate (100 = nasjonalt snitt) | 2025 | 357 | 0 | 58.8771298331957 | 142.271943379717 | 2026-05-06T14:33:01.602+00:00 |
| fhi-bor-alene | TELLER | Antall personer | 2025 | 357 | 0 | 47 | 202221 | 2026-05-06T14:33:01.602+00:00 |
| fhi-mobbing | RATE_grade10 | Andel (prosent) (10. trinn) | 2022 | 167 | 190 | 3.36473755047106 | 18.3098591549296 | 2026-05-06T14:34:02.398+00:00 |
| fhi-mobbing | RATE_grade7 | Andel (prosent) (7. trinn) | 2022 | 208 | 149 | 2.72479564032698 | 36.3636363636364 | 2026-05-06T14:34:02.398+00:00 |
Built from
This Atlas view joins data from the following upstream sources. Click through for provenance, methodology, and citation.
Atlas internal model ↗
fact_kommune_indicators
First cross-source mart.
Atlas internal model ↗
mart_meta_sources
One row per ingested source: publisher, licence, coverage, freshness and what it feeds.
Showing direct dbt parents. See full lineage in /lineage/ →
Columns
| Column | Description |
|---|---|
| source_id | Atlas source identifier, e.g. 'ssb-08764'. Joins back to fact_kommune_indicators.source_id and to the source declarations in indicators/sources.yml. |
| contents_code | Source-specific ContentsCode verbatim from upstream (e.g. 'EUskala60', 'Folkemengde'). Combined with source_id forms the natural key of this view. |
| contents_label | Human-readable label for contents_code, verbatim from upstream. NULL only if every contributing row had a NULL label (rare). |
| upstream_title | What this series is ABOUT, from the source catalogue. The subject was previously unreachable from this view — a consumer used 8 of 195 series and missed the ones matching its own question, because `contents_label` describes the UNIT ("Andel (prosent)") and the subject lived only in an opaque slug (urb-agents #1250, #1252). Joined from mart_meta_sources; NULL only if a source is absent from the catalogue, which `relationships` below asserts cannot happen. |
| publisher | Who publishes the upstream series (SSB, FHI, Bufdir, Brreg). Joined from mart_meta_sources. |
| eu_theme | EU high-value-dataset theme. Populated for all 44 sources — filter on it to ask "what does Atlas have about X?", which is the question this view could not previously answer. |
| tags | Topic vocabulary from the source manifest, e.g. ['provider:brreg', 'topic:ngo-supply']. Joined from mart_meta_sources. 🔴 QUOTE THE VALUE. A tag contains a colon, and unquoted it is rejected: `?tags=cs.{topic:ngo-supply}` returns 22P02 malformed array literal. The working form is `?tags=cs.{"topic:ngo-supply"}`. ⚠️ The unquoted spelling was published HERE, in this description, until 2026-09-20 — so a consumer following the documentation got an error and had to work the quoting out for itself (urb-agents #1281). Same class as the `personer` description: the contract said something a consumer acted on and it was wrong. |
| latest_year | Most recent calendar year for which this (source_id, contents_code) has a VALUE in fact_kommune_indicators. The coverage and value-range columns below are computed against this year only. 🔴 THIS CHANGED ON 2026-09-21 AND THE OLD BEHAVIOUR WAS WRONG. It was "has any rows", which pointed at years the publisher had not released yet: upstream ships the full grid, so a row exists with a NULL value. Seven of `ssb-06913`'s eight series resolved to 2026 with `kommuner_with_value` 0 and both value bounds null — a live series whose summary read as empty (urb-agents #1351). ⚠️ IT IS THE LATEST YEAR AN ACTIVE, NON-SENTINEL KOMMUNE HAS A VALUE — the same subject the coverage below is counted over. A first version filtered only on `value is not null` and was defeated by SSB zero-filling retired kommune codes: 0101 Halden (-2019) and 0801 Kragerø (-1959) carry a literal 0 for every year forever, so the year looked populated while every active kommune was null there. `latest_year` and `kommuners_with_value` disagreed about which rows count (urb-agents #1354). ⚠️ A series with no value in ANY year keeps the newest year it has rows for, rather than going null. Disappearing from the catalogue is the worse failure: "0 of 357" invites a question, an absent row does not. ⚠️ READ IT WITH `latest_year_window_years`. For a windowed source this is the FIRST year of the window, not the year of the data, and rendering it alone prints a date that is wrong by up to four years. |
| latest_year_window_years | How many calendar years `latest_year` covers: 1 for an annual series, 5 for `fhi-selvmord`, 3 for `fhi-mobbing`. The span is `latest_year` to `latest_year + latest_year_window_years - 1`. 🔴 WHY IT IS A COLUMN AND NOT A SENTENCE. The window was already stated in prose in this catalogue. On 2026-09-21 it was misread twice in one day in opposite directions — a reviewer called a live `fhi-selvmord` series six years stale, and a consumer shipped the caption «Mobbetallene er fra 2022» for a 2022-2024 window. The consumer's proposed workaround, matching `/1-year/i` against the description, false-positives on `fhi-kpr-1aar`, whose title contains "KPR 1-year" and which is annual anyway (urb-agents #1331). 🔵 CROSS-CHECK IT AGAINST `meta_dimensions`, WHICH SAID ALL THIS FIRST. `?code=in.(AAR,Tid)&select=source_id,meaning,value_format` carries the upstream's own description of its time dimension. On 2026-09-21 a consumer, ops-dev and this agent each derived the windowing independently while that relation was already published and already said it — and the claim "exactly two FHI sources are windowed", used as evidence, was wrong; the catalogue named three (urb-agents #1333). ⚠️ IT IS A `max()` OVER THE KOMMUNER AT `latest_year`, because this view's grain is one row per (source, contents_code) and the window lives on the fact row. That is only honest if the window is uniform across kommuner within an indicator-year, which is asserted by the singular test `window_is_uniform_within_an_indicator_year`. If that test ever fails, this column is lossy and the failure is the warning. |
| kommuner_with_value | Count of active kommuner (kommune_is_active = true) that have a non-NULL value for this indicator at latest_year. The headline coverage number on the data explorer. |
| kommuner_with_null | 🔴 FOR AN `fhi-*` SOURCE THIS IS SUPPRESSION, NOT ABSENCE, AND THE TWO LEAD TO OPPOSITE CONCLUSIONS IN A NEED INDEX. FHI hides small numbers by policy. Quoted from FHI's own table metadata (table 377, read 2026-09-22): "Statistikk basert på færre enn 6 tilfeller skjules av personvernhensyn... Dersom mer enn 20 prosent av tallene i en tidsserie er skjult av personvernhensyn, skjules hele tidsserien for ikke å skape et skjevt inntrykk av situasjonen i kommunen." So FHI hides a cell under ~6 cases, and hides the WHOLE SERIES when more than 20% of it is hidden — explicitly to avoid giving a skewed impression of that kommune. ⚠️ A consumer that reads the resulting gap as "no need here" is producing exactly the skew the suppression exists to prevent, and doing it in the direction that moves help away from the smallest places. 🔵 MEASURED, and the shape is unambiguous (urb-agents #1369, #1379): 105 kommuner are missing from 10 or more `fhi-*` series, median population 1,452, monotonic in population. `1151 Utsira`, 219 people, is missing from 15. EVERY kommune is absent from at least three series — so a kommune appearing here is ordinary and is not a defect to report. ⚠️ The thresholds above are table 377's; the policy is FHI-wide but each table states its own. Read the source's metadata rather than assuming 6. 🔵 It is NOT suppression for SSB sources. SSB zero-fills instead — a dissolved kommune carries a literal 0 forever — which is a different failure and was the cause of the `latest_year` defect fixed in a657f4f. Two publishers, two conventions, and the same column has to be read differently for each. Count of active kommuner that have a row at latest_year but value IS NULL (i.e. upstream suppressed the cell). Inactive kommuner are not counted. |
| min_value | Minimum non-NULL value across all rows at latest_year, regardless of whether the kommune is active. NULL if no row had a value. |
| max_value | Maximum non-NULL value across all rows at latest_year, regardless of whether the kommune is active. NULL if no row had a value. |
| upstream_updated | Most recent fact_kommune_indicators.updated_at across the rows that contributed to this summary. Useful for staleness checks per indicator without joining to raw.*. |
Sample query
Live PostgREST query that returns the first 5 rows. URL adapts to the current host — local dev shows api-atlas.localhost; the deployed site shows the configured API base.
https://api-atlas.urbalurba.com/indicator_summary?limit=5
About this view
One row per indicator and source: latest year, kommune coverage and value range.
One row per (source_id, contents_code) summarising the latest-year
coverage and value range for every indicator in
fact_kommune_indicators. This is the backing dataset for the data
explorer index page (atlas-frontend /data) and is the equivalent of
the listIndicators() inline query that PostgREST projects as
/mart_indicator_summary on the public API.
Query shape: latest-year-per-indicator + group-by + value/null counts
filtered to active kommuner only. Inactive kommuner (historical
codes retained by upstream) are excluded from the counts so consumers
see "how many of today's kommuner have data?" not "how many rows
exist?".
Refreshed nightly together with fact_kommune_indicators. The
upstream_updated column carries the most recent raw load timestamp
across the rows that contributed to this summary, so freshness can
be inspected per indicator without joining to raw.* sources.