# Analyzing Construction Activity & Market Momentum

This page explains how Aterio builds monthly momentum metrics for US data centers, using the latest inventory and events data. These outputs are used in dashboards and can be replicated or adapted by clients in their own environments.

We currently generate 2 main calculations:

1. Under Construction Momentum
2. Announced Momentum

#### Source Tables

The momentum logic is based on two core datasets:

* **Inventory**
  * `ATERIO_DATA_CENTER_UID (PK)`
  * `COUNTRY_CODE`
  * `STATE_CODE`
  * `SELECTED_POWER_CAPACITY_MW`
  * `TOT_DATACENTER_SPACE_SQFT`
* **Events**
  * `ATERIO_DATA_CENTER_UID`
  * `EVENT_TYPE` (e.g. Announced, Construction Started, Active, Cancelled, Not Approved / Withdrawn)
  * `EVENT_DATE`&#x20;

#### Under Construction Momentum

**Goal:** For each month end, estimate how much capacity and square footage is actively under construction.

**Logical Rules**

For a given facility and a given month `AS_OF_MONTH`, it is considered Under Construction if:

* `construction_start_date IS NOT NULL (not empty value)`, and&#x20;
* `construction_start_date <= AS_OF_MONTH`, and
* `activation_date IS NULL (empty value) OR activation_date > AS_OF_MONTH`

*In other words, construction has started, but the facility is not yet active.*

We then aggregate by `STATE_CODE (or any other dimension)` and `AS_OF_MONTH`:

* `q_under_construction_facilities` – count of facilities
* `s_under_construction_power_mw` – sum of `SELECTED_POWER_CAPACITY_MW`
* `s_under_construction_square_footage` – sum of `TOT_DATACENTER_SPACE_SQFT`

**Example**

This chart illustrates under-construction momentum: bars indicate facility counts, and the line reflects MW capacity.

<figure><img src="/files/GXCckSa3cpF6j1ZNfSh2" alt=""><figcaption><p>Ongoing Construction Momentum by Month</p></figcaption></figure>

**SQL Script**

<pre class="language-sql"><code class="lang-sql">WITH dc_dates AS (
  SELECT
    inv.ATERIO_DATA_CENTER_UID,
    inv.STATE_CODE,
    inv.SELECTED_POWER_CAPACITY_MW AS power_capacity_mw,
    inv.TOT_DATACENTER_SPACE_SQFT  AS square_footage,
    MIN(IF(ev.EVENT_TYPE = 'Construction Started', ev.EVENT_DATE, NULL)) AS construction_start_date,
    MIN(IF(ev.EVENT_TYPE = 'Active',               ev.EVENT_DATE, NULL)) AS activation_date
  FROM `[Data Center Inventory Table]`  inv
  LEFT JOIN `[Data Center Events Table]` ev
    ON ev.ATERIO_DATA_CENTER_UID = inv.ATERIO_DATA_CENTER_UID
  WHERE inv.COUNTRY_CODE = 'US'
  GROUP BY 1,2,3,4
),
month_series AS (
  SELECT
    LAST_DAY(d, MONTH) AS asof_month
  FROM UNNEST(GENERATE_DATE_ARRAY(
        DATE '2021-01-01',
        CURRENT_DATE(),
        INTERVAL 1 MONTH)) AS d
),
under_construction AS (
  SELECT
    ms.asof_month,
    dd.STATE_CODE,
    COUNTIF(
      dd.construction_start_date IS NOT NULL
      AND dd.construction_start_date &#x3C;= ms.asof_month
      AND (dd.activation_date IS NULL OR dd.activation_date > ms.asof_month)
    ) AS q_under_construction_facilities,
    SUM(
      IF(
        dd.construction_start_date IS NOT NULL
        AND dd.construction_start_date &#x3C;= ms.asof_month
        AND (dd.activation_date IS NULL OR dd.activation_date > ms.asof_month),
        dd.power_capacity_mw,
        0
      )
    ) AS s_under_construction_power_mw,
    SUM(
      IF(
        dd.construction_start_date IS NOT NULL
        AND dd.construction_start_date &#x3C;= ms.asof_month
        AND (dd.activation_date IS NULL OR dd.activation_date > ms.asof_month),
        dd.square_footage,
        0
      )
    ) AS s_under_construction_square_footage
  FROM month_series ms
<strong>  CROSS JOIN dc_dates dd
</strong>  GROUP BY 1,2
)
SELECT
  STATE_CODE,
  asof_month,
  FORMAT_DATE('%Y-%m', asof_month) AS asof_month_yyyy_mm,
  q_under_construction_facilities,
  s_under_construction_power_mw,
  s_under_construction_square_footage
FROM under_construction
WHERE FORMAT_DATE('%Y-%m', asof_month) != FORMAT_DATE('%Y-%m', CURRENT_DATE())
ORDER BY STATE_CODE, asof_month;

</code></pre>

#### Announced Momentum

**Goal:** For each state and month end, estimate the announced pipeline that has not yet moved into construction, activation, cancellation, or withdrawal.

**Logical Rules**

For a given facility and `AS_OF_MONTH`, it is included in Announced Momentum if:

* `announced_date IS NOT NULL (not empty value) and announced_date <= AS_OF_MONTH`, and
* `construction_start_date IS NULL (empty value) OR construction_start_date > AS_OF_MONTH`, and
* `activation_date IS NULL (empty value) OR activation_date > AS_OF_MONTH`, and
* `cancelled_date IS NULL (empty value) OR cancelled_date > AS_OF_MONTH`, and
* `project_withdrawn_date IS NULL (empty value) OR project_withdrawn_date > AS_OF_MONTH`

*So we capture the “pure” announced pipeline that is still live and has not yet progressed or been cancelled.*

**Example**

This chart illustrates announced momentum: the bars indicate facility counts, and the line reflects MW capacity.

<figure><img src="/files/lnqQPZ9j4QaFfMr72Blz" alt=""><figcaption><p>Ongoing Announcement Momentum</p></figcaption></figure>

**SQL Script**

```sql
WITH dc_dates AS (
  SELECT
    inv.ATERIO_DATA_CENTER_UID,
    inv.STATE_CODE,
    inv.SELECTED_POWER_CAPACITY_MW AS power_capacity_mw,
    inv.TOT_DATACENTER_SPACE_SQFT  AS square_footage,
    MIN(IF(ev.EVENT_TYPE = 'Construction Started',       ev.EVENT_DATE, NULL)) AS construction_start_date,
    MIN(IF(ev.EVENT_TYPE = 'Announced',                  ev.EVENT_DATE, NULL)) AS announced_date,
    MIN(IF(ev.EVENT_TYPE = 'Active',                     ev.EVENT_DATE, NULL)) AS activation_date,
    MIN(IF(ev.EVENT_TYPE = 'Cancelled',                  ev.EVENT_DATE, NULL)) AS cancelled_date,
    MIN(IF(ev.EVENT_TYPE = 'Not Approved/Withdrawn',     ev.EVENT_DATE, NULL)) AS project_withdrawn_date
  FROM `[Data Center Inventory Table]` inv
  LEFT JOIN `[Data Center Events Table]` ev
    ON ev.ATERIO_DATA_CENTER_UID = inv.ATERIO_DATA_CENTER_UID
  WHERE inv.COUNTRY_CODE = 'US'
  GROUP BY 1,2,3,4
),
month_series AS (
  SELECT
    LAST_DAY(d, MONTH) AS asof_month
  FROM UNNEST(GENERATE_DATE_ARRAY(
        DATE '2021-01-01',
        CURRENT_DATE(),
        INTERVAL 1 MONTH)) AS d
),
announcements AS (
  SELECT
    ms.asof_month,
    dd.STATE_CODE,
    COUNTIF(
      dd.announced_date IS NOT NULL
      AND dd.announced_date <= ms.asof_month
      AND (dd.construction_start_date IS NULL OR dd.construction_start_date > ms.asof_month)
      AND (dd.activation_date        IS NULL OR dd.activation_date        > ms.asof_month)
      AND (dd.cancelled_date         IS NULL OR dd.cancelled_date         > ms.asof_month)
      AND (dd.project_withdrawn_date IS NULL OR dd.project_withdrawn_date > ms.asof_month)
    ) AS q_announcements,
    SUM(
      IF(
        dd.announced_date IS NOT NULL
        AND dd.announced_date <= ms.asof_month
        AND (dd.construction_start_date IS NULL OR dd.construction_start_date > ms.asof_month)
        AND (dd.activation_date        IS NULL OR dd.activation_date        > ms.asof_month)
        AND (dd.cancelled_date         IS NULL OR dd.cancelled_date         > ms.asof_month)
        AND (dd.project_withdrawn_date IS NULL OR dd.project_withdrawn_date > ms.asof_month),
        dd.power_capacity_mw,
        0
      )
    ) AS s_announcements_power_capacity,
    SUM(
      IF(
        dd.announced_date IS NOT NULL
        AND dd.announced_date <= ms.asof_month
        AND (dd.construction_start_date IS NULL OR dd.construction_start_date > ms.asof_month)
        AND (dd.activation_date        IS NULL OR dd.activation_date        > ms.asof_month)
        AND (dd.cancelled_date         IS NULL OR dd.cancelled_date         > ms.asof_month)
        AND (dd.project_withdrawn_date IS NULL OR dd.project_withdrawn_date > ms.asof_month),
        dd.square_footage,
        0
      )
    ) AS s_announcements_square_footage
  FROM month_series ms
  CROSS JOIN dc_dates dd
  GROUP BY 1,2
)
SELECT
  STATE_CODE,
  asof_month,
  FORMAT_DATE('%Y-%m', asof_month) AS asof_month_yyyy_mm,
  q_announcements,
  s_announcements_power_capacity,
  s_announcements_square_footage
FROM announcements
WHERE FORMAT_DATE('%Y-%m', asof_month) != FORMAT_DATE('%Y-%m', CURRENT_DATE())
ORDER BY STATE_CODE, asof_month;

```

#### How Clients Can Use These Metrics

Typical use cases include:

* Tracking pipeline evolution over time by state or provider
* Identifying markets with growing construction momentum vs. stalled projects
* Comparing announced vs under-construction ratios to assess project conversion
* Building charts of monthly MW in Announced / Under Construction / Active stage&#x73;*.*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://knowledge.aterio.io/data-products/us-data-centers/use-cases/analyzing-construction-activity-and-market-momentum.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
