On this page
Key takeaways
- Semantic profiling tells the AI what each column means, not just what type it is.
- It detects five things: data type, role, units, value patterns and relationships.
- Good profiles are the main reason simple questions get correct answers.
- You can help with clear names, one row per record and consistent formats.
Why profiling comes first
A database knows that a column holds numbers. It does not know that the numbers are US dollars that should be summed, or customer IDs that should be counted, or ratings that should be averaged. An AI that writes queries needs to know the difference.
Semantic profiling fills that gap. When you upload a file or connect a source in DashboardGPT, each column is analysed and described before any question is asked. Every later answer depends on that description.
What gets detected
1. Data type
The storage type: number, text, date, date-time or true/false. Profiling also catches common problems, such as dates stored as text ("2026-08-14") or numbers stored with symbols ("$1,250.00").
2. Role
How the column should be used in analysis:
| Role | Meaning | Example columns | Typical use |
|---|---|---|---|
| Time | When something happened | order_date, created_at | Trends, windows, grains |
| Measure | A quantity to aggregate | order_value_usd, seats | Sum, average, min, max |
| Category | A label to group by | region, plan, channel | Breakdowns and filters |
| Identifier | A key for a record | order_id, customer_id | Count distinct, joins |
| Text | Free text | notes, description | Search, rarely aggregated |
Role is the most important detection. Summing an identifier or grouping by a free-text field produces confident nonsense.
3. Units
Currency, percentage, duration, count. Units decide how numbers are formatted ($4.8M, 27%, 3.2 days) and whether they can be added together. Percentages, for example, should usually be averaged with care, not summed.
4. Value patterns
The shape of the values: how many distinct values a category has, the range of a measure, how many values are missing, and whether codes like 1, 2, 3 stand for labels.
These patterns shape answers. A category with 8 values makes a good breakdown; one with 40,000 values does not.
5. Relationships
Which columns link tables together, such as orders.customer_id to customers.id, and what one row represents in each table (one order, one line item, one subscription change). Knowing the grain prevents the most common analysis error: totals inflated by joins.
An example profile
For an orders file, a profile might look like this:
| Column | Type | Role | Unit | Notes |
|---|---|---|---|---|
order_id | text | identifier | Unique per row | |
order_date | date | time | Primary time column | |
customer_id | text | identifier | Repeats: 1 to 40 orders per customer | |
region | text | category | 5 values | |
channel | text | category | 7 values | |
order_value_usd | number | measure | USD | Sum for revenue |
discount_usd | number | measure | USD | 0 for most rows |
status | text | category | delivered, returned, cancelled |
With this profile, "Revenue by channel last quarter" becomes a sum of order_value_usd, grouped by channel, filtered on order_date. No guessing needed.
How to help the profiler
- Use descriptive names:
order_value_usd, notvaloramt2. - Include units in names when it helps:
_usd,_pct,_days. - Keep one row per record and remove subtotal rows.
- Use one date format throughout, ideally
YYYY-MM-DD. - Store numbers as numbers, without currency symbols or thousands separators.
- Replace codes with labels where you can:
cancelledinstead of3. - Check the profile after upload and correct any column that was read wrongly.
What profiling does not do
Profiling describes what the data is. It does not decide your business definitions. Whether "active customer" means "ordered in the last 90 days" or "has an open subscription" is a decision your team makes. State it in the question, and the query will follow it.