Select columns, filter rows, and transform data with NQL
This guide covers the fundamentals of querying data with NQL: selecting columns, filtering rows with WHERE clauses, and transforming data using expressions and functions.
SELECT user_id, category, source, created_atFROM company_data."123"WHERE category IN ('electronics', 'clothing', 'home') AND source NOT IN ('test', 'internal')
SELECT user_id, email, name, codeFROM company_data."123"WHERE email LIKE '%@gmail.com' -- Ends with @gmail.com AND name LIKE 'John%' -- Starts with John AND code LIKE 'A__' -- A followed by exactly 2 characters
Wildcard
Matches
%
Zero or more characters
_
Exactly one character
For case-insensitive matching, normalize the case first:
SELECT user_id, event_date, event_typeFROM company_data."123"WHERE EXTRACT(YEAR FROM event_date) = 2024 AND EXTRACT(MONTH FROM event_date) IN (1, 2, 3) AND EXTRACT(DAYOFWEEK FROM event_date) = 1 -- Sunday
SELECT user_id, CASE WHEN lifetime_value > 1000 THEN 'platinum' WHEN lifetime_value > 500 THEN 'gold' WHEN lifetime_value > 100 THEN 'silver' ELSE 'bronze' END AS tierFROM company_data."123"
SELECT UPPER(name) AS uppercase_name, LOWER(email) AS lowercase_email, TRIM(user_input) AS cleaned_input, CONCAT(city, ', ', state) AS location, SUBSTRING(phone, 1, 3) AS area_codeFROM company_data."123"
SELECT CAST(string_number AS LONG) AS numeric_value, CAST(timestamp_value AS DATE) AS date_only, CAST(amount AS DECIMAL) AS precise_amountFROM company_data."123"
SELECT -- Array of structs identifiers[0].type AS first_id_type, identifiers[0].value AS first_id_value, -- Struct with nested struct user.preferences.language, user.preferences.timezoneFROM company_data."123"
SELECT COUNT(1) AS total_rows, APPROX_COUNT_DISTINCT(user_id) AS unique_users, SUM(amount) AS total_amount, AVG(score) AS average_score, MIN(created_at) AS earliest, MAX(created_at) AS latestFROM company_data."123"
Here’s a complete example combining multiple techniques:
SELECT user_id, LOWER(email) AS normalized_email, CASE WHEN age < 25 THEN '18-24' WHEN age < 35 THEN '25-34' WHEN age < 45 THEN '35-44' ELSE '45+' END AS age_bracket, identifiers[0].type AS primary_id_type, created_atFROM company_data."123"WHERE email IS NOT NULL AND status = 'active' AND created_at >= CURRENT_DATE - INTERVAL '90' DAY AND _price_cpm_usd <= 0.50QUALIFY ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY created_at DESC) = 1ORDER BY created_at DESCLIMIT 1000 ROWS