Facts
A fact is the answer to one reported question for one entity in one year, as
established by the Net Purpose data collection process. The fact itself carries the
final standardised value; the evidence behind it lives in supporting_facts.
Facts are split across two views with identical shapes: revenue_facts
holds the revenue-breakdown questions (product and geographic revenue
segments) that feed the Revenue & SDI dataset, and
outcomes_facts holds everything else.
Each fact has at least one supporting fact. Where a given fact has multiple facts the total value is given by the aggregation of the fact.
| Aggregation | Description |
|---|---|
NONE | There will be a supporting fact listed as is_total. This fact represents the aggregate level, other supporting facts are provided for context only. |
SUM | The fact value is the sum of all the underlying segments. |
AVG | The fact value is the average (mean) of the underlying segments. |
All applicable questions are attempted to be collected for all entities in the Net Purpose universe. Where no data can be found a NOT FOUND fact record is created. The absence of a fact for a given enitty_id, question_id, year indicates that the question is not applicable to that entity or the data has not yet been looked for.
All views on this page except segments are versioned — filter
is_current = TRUE (see Conventions).
revenue_facts and outcomes_facts
One row per fact, per version. Both views share the same columns:
| Column | Type | Description |
|---|---|---|
fact_id | NUMBER | Primary key |
entity_id | NUMBER | Who. Joins to entities |
question_id | NUMBER | What. Joins to questions |
canonical_question_id | VARCHAR | The question’s readable slug, for convenience |
year | NUMBER | Fiscal year of the answer determined by our assignment logic |
start / end | DATE | Exact period the value covers |
value | FLOAT | The final standardised value |
unit | VARCHAR | Unit of the value. As a string, join to units on units.name |
aggregation | VARCHAR | How supporting values were combined into the final value (e.g. SUM) |
supporting_facts
The individual pieces of evidence behind a fact — typically the numbers as they appear in the source document, one row each.
| Column | Type | Description |
|---|---|---|
supporting_fact_id | NUMBER | Primary key. |
fact_id | NUMBER | The fact this evidence supports |
recorded_value | FLOAT | The value exactly as printed in the source |
recorded_unit | VARCHAR | Unit of the recorded value, as printed, as a string. |
standardized_value | FLOAT | The value after unit/currency standardisation |
standardized_unit | VARCHAR | Unit of the standardised value, as a string |
is_total | BOOLEAN | Whether this row is a disclosed total (rather than a component) |
is_derived | BOOLEAN | Whether the value was derived rather than read directly. See comment for any derivation notes. |
is_low_confidence | BOOLEAN | Flagged where the disclosure was ambiguous |
segment_id | NUMBER | A descriptor of the segregation. THe type of disaggregatino depends on the metric. e.g. product_revenue is by product segments, Scope 1 CO2e emissions are by geography. Joins to segments |
source_id | NUMBER | Document the value was found in. Joins to sources |
page_num | NUMBER | Page of the document |
comment | VARCHAR | Analyst note giving context on the evidence. |
segments
Segments are disaggregations of the top-level fact. The dimension of the disaggregation depends on the question, but typically is geographic. The segment_category gives high level grouping of the different types of segment.
A segment name has three parts, from general to specific:
segment_category : segment_class : segment_instance.
| Column | Type | Description |
|---|---|---|
segment_id | NUMBER | Primary key |
segment_category | VARCHAR | Top-level grouping of the segment |
segment_class | VARCHAR | Middle grouping |
segment_instance | VARCHAR | The specific segment as disclosed |
type | VARCHAR | Segment kind; most rows are plain segment |
Example: trace a value to its evidence
SELECT f.entity_id,
f.canonical_question_id,
f.year,
f.value AS final_value,
f.unit,
sf.recorded_value,
sf.recorded_unit,
s.name AS source_document,
s.url,
sf.page_num
FROM NET_PURPOSE.FOUNDATIONS.OUTCOMES_FACTS f
JOIN NET_PURPOSE.FOUNDATIONS.SUPPORTING_FACTS sf
ON sf.fact_id = f.fact_id AND sf.is_current = TRUE
LEFT JOIN NET_PURPOSE.REFERENCE.SOURCES s
ON s.source_id = sf.source_id
WHERE f.is_current = TRUE
AND f.entity_id = 12345
AND f.canonical_question_id = 'scope_1_co2e_emissions'
AND f.year = 2024;