systemnote2
transactionThe second-generation change log: the same field-level history as systemnote, but with the old and new values split into typed columns — string, numeric, date, boolean and reference — beside a UTC change timestamp.
the value columns are MUTUALLY EXCLUSIVE per row: valuedatatype names which typed pair is populated and the others are null, so a change history reads as a COALESCE over the typed columns, never as one column.
Browser page name is SystemNote2 (label "System Notes v2"). The grain is one row per logged CHANGE, as on systemnote: objectid repeats once per edit, so it is authored as a pointer rather than a key. Which of the two change logs an account populates is an account-level answer — check for rows in both before you pick one, and never assume the two are a complete history between them. timestamputc is UTC, unlike most stamps in this catalog, so it needs converting before it lines up with a local-time report. The page also carries reference-typed old/new values as two-part keys and a set of root-object key columns; both are left out of the curated field rows as plumbing rather than analysis columns.
What the badges mean
- master
- Data class: what the record holds — master data, transaction documents, control/configuration, or a documented convenience record. NetSuite has no product-family or schema axis, so this is the whole classification.
- Subsidiary-scoped
- The record carries a
subsidiarycolumn that partitions its rows, so the generated SQL anchors it. On a few records the column is a multiselect rather than a scalar foreign key — the table notes say which (see the quirks guide). - Location-scoped
- The record carries a
locationcolumn — an org segment in NetSuite before it is a warehouse — and the generated SQL anchors it the same way. - View
- A documented convenience record rather than a stored one. Land the records it stands in for instead of assuming it extracts as-is — the table notes say where the rows actually live.
Structural facts — how the record is partitioned, not a trap by itself
Join & extract hazards — verify before you rely on this
'T'/'F' string.Fields
18 fields
18 fields.
| # | Field | Description | Type | Flags |
|---|---|---|---|---|
| 1 | objectid | Internal id of the object that changed — repeats once per logged change | NUMBER | |
| 2 | instancename | Object name as displayed | VARCHAR | |
| 3 | objectelementname | Element that changed, by name | VARCHAR | |
| 4 | objectactiontype | Action performed on the object (internal id) | NUMBER | |
| 5 | valuedatatype | Which typed value pair below is populated (internal id) — the others are null | NUMBER | |
| 6 | valueoldstring | Old value, string form | VARCHAR | |
| 7 | valuenewstring | New value, string form | VARCHAR | |
| 8 | valueolddisplayname | Old value as the UI displayed it | VARCHAR | |
| 9 | valuenewdisplayname | New value as the UI displayed it | VARCHAR | |
| 10 | valueoldnumber | Old value, numeric form — no casting needed, unlike systemnote | NUMBER | |
| 11 | valuenewnumber | New value, numeric form | NUMBER | |
| 12 | valueolddate | Old value, date form | TIMESTAMP | |
| 13 | valuenewdate | New value, date form | TIMESTAMP | |
| 14 | valueoldboolean | Old value, boolean form | VARCHAR | |
| 15 | valuenewboolean | New value, boolean form | VARCHAR | |
| 16 | actor | Who made the change (internal id) | NUMBER | |
| 17 | context | Context the change came from (internal id) — UI, CSV, script | NUMBER | |
| 18 | timestamputc | When the change was made, in UTC | TIMESTAMP | The record's primary analysis date — a real DATE/TIMESTAMP column, no conversion needed |
Field provenance: hand-curated.
Boilerplate SQL
Starting point for reading the Connect-landed copy of systemnote2 on Databricks — dates are real DATE/TIMESTAMP columns and need no conversion, and the partition anchors are already in place. This record carries no modification stamp, and the snippet says so where the watermark would otherwise go. Set your Unity Catalog location, schema, and filter values below; they’re substituted into the SQL and the copy button.
4 parameters not filled: <catalog>, <schema>, <DATE_FROM>, <DATE_TO>
-- ============================================================
-- Table : systemnote2 — The second-generation change log: the same field-level history as systemnote, but with the old and new values split into typed columns — string, numeric, date, boolean and reference — beside a UTC change timestamp.
-- Purpose: Column-selected read of systemnote2 — auto-generated from field metadata
-- Grain : One row per record — see the Fields section for the full key
-- Caution: the value columns are MUTUALLY EXCLUSIVE per row: valuedatatype names which typed pair is populated and the others are null, so a change history reads as a COALESCE over the typed columns, never as one column.
-- Notes : Auto-generated skeleton for NetSuite data landed in your lakehouse from a SuiteAnalytics Connect (or SuiteQL) extract — it never addresses live NetSuite. Identifiers are lowercase as NetSuite2.com renders them. Select-type columns hold numeric internal ids: BUILTIN.DF() display resolution exists only at extraction time, so decode ids by joining the landed list records; see quirks #display-values. Check-box columns arrive as 'T'/'F' strings; see quirks #tf-booleans.
-- ============================================================
SELECT
t.objectid AS "Internal id of the object that changed — repeats once per logged change",
t.instancename AS "Object name as displayed",
t.objectelementname AS "Element that changed, by name",
t.objectactiontype AS "Action performed on the object (internal id)",
t.valuedatatype AS "Which typed value pair below is populated (internal id) — the others are null",
t.valueoldstring AS "Old value, string form",
t.valuenewstring AS "New value, string form",
t.valueolddisplayname AS "Old value as the UI displayed it",
t.valuenewdisplayname AS "New value as the UI displayed it",
t.valueoldnumber AS "Old value, numeric form — no casting needed, unlike systemnote",
t.valuenewnumber AS "New value, numeric form",
t.valueolddate AS "Old value, date form",
t.valuenewdate AS "New value, date form",
t.valueoldboolean AS "Old value, boolean form", -- 'T'/'F' string — compare = 'T', or CAST via CASE; see quirks #tf-booleans
t.valuenewboolean AS "New value, boolean form", -- 'T'/'F' string — compare = 'T', or CAST via CASE; see quirks #tf-booleans
t.actor AS "Who made the change (internal id)",
t.context AS "Context the change came from (internal id) — UI, CSV, script",
t.timestamputc AS "When the change was made, in UTC"
FROM <catalog>.<schema>.systemnote2 t
WHERE
1 = 1 -- no partition column on this record; the filters below are optional
-- AND t.timestamputc >= TIMESTAMP '<DATE_FROM>'
-- AND t.timestamputc <= TIMESTAMP '<DATE_TO>'
-- no lastmodifieddate on this record — there is no watermark column, so incremental extraction must full-refresh it (see quirks #deletes)
;Verified August 2026 · Analytics Browser 2021.1 · corroborated 2025.2
Select columns hold internal ids, not display text — see decoding display values.
Relationships
Diagram of 1-hop neighbors — join details below. Document-link edges are highlighted; they chain one document to the next and are the joins newcomers most often get wrong.
More Platform tables
- deletedrecordThe deletion ledger: one row per deleted record with its type, name, script id, who deleted it and when. The only public evidence that something disappeared.
- systemnoteThe field-level change log: one row per record, field and change, with who changed it, in what context, and the old and new values as text.