Skip to content

DuckDB

DuckDB is an in-process SQL OLAP database management system you can run on your local machine.

For the Slate data pipeline work, DuckDB can ba a transformation layer, pull flat files or exports from Slate, run analytical SQL against them locally or in a pipeline step, then push results to a warehouse. It’s a natural fit for prototyping analytics logic before uploading data to Redshift.

curl https://install.duckdb.org | sh

Learn more on the DuckDB website.

Jump into using DuckDB. DuckDB uses a single file to store data. You can name the .duckdb file whatever you’d like.

duckdb slate.duckdb

You can use DuckDB’s ATTACH to connect to Slate and extract data. Make sure to use the correct username, password, and port number.

ATTACH 'mssql://slate_dbname_username:{ SLATE_DB_PASSWORD_UNDG }@sql.technolutions.net:1444/dbname?use_encrypt=true' AS crm (TYPE mssql);
ATTACH 'mssql://slate_dbname_username:{ SLATE_DB_PASSWORD_GRAD }@sql.technolutions.net:1444/dbname?use_encrypt=true' AS crm (TYPE mssql);

Now run queries to collect table data from Slate.

CREATE OR REPLACE TABLE activities AS SELECT id, date AS created_at, code, summary, source AS source_id, record AS person_id FROM crm.dbo.activity;

A person may have more than one address, so consider sorting by type or rank. Addresses can also be joined to the applications table.

CREATE OR REPLACE TABLE addresses AS SELECT record AS record_id, city, county, region, country, postal AS postal_code, geomarket, type, rank_overall AS rank FROM crm.dbo.address;
ColumnType
record_iduuid
cityvarchar
countyvarchar
regionvarchar
countryvarchar
postal_codevarchar
geomarketuuid
typevarchar
rankinteger
CREATE OR REPLACE TABLE applications AS SELECT id,person AS person_id, status, created AS created_at, submitted AS submitted_at FROM crm.dbo.application;
ColumnType
iduuid
person_iduuid
statusvarchar
created_attimestamp
submitted_attimestamp
CREATE OR REPLACE TABLE decisions AS SELECT application AS application_id, released AS released_at, code FROM crm.dbo.decision;
ColumnType
application_iduuid
released_attimestamp
codevarchar

Helpful links from the Slate documentation: see [https://knowledge.technolutions.net/docs/standard-fields-prompts](standard Slate person-scoped fields) and [https://knowledge.technolutions.net/docs/application-fields](creating application-scoped fields and prompts).

CREATE OR REPLACE TABLE fields AS SELECT record AS record_id, field, prompt, value FROM crm.dbo.field WHERE record IS NOT NULL;
ColumnType
record_iduuid
fieldvarchar
promptuuid
valuevarchar

If you’d prefer to query some fields, you can pluck them by field value. This can also help with data migration, as the field table can be large.

CREATE OR REPLACE TABLE fields AS SELECT record AS record_id, field, prompt, value FROM crm.dbo.field WHERE record IS NOT NULL AND field IN ('ga_id','intended_term','intended_program','utm_campaign','utm_source','utm_medium');
CREATE OR REPLACE TABLE form_responses AS SELECT id, record AS record_id, referrer AS url, utm_campaign, utm_source, utm_medium, submitted AS submitted_at FROM crm.dbo."form.response";
ColumnType
iduuid
record_iduuid
urlvarchar
utm_campaignvarchar
utm_sourcevarchar
utm_mediumvarchar
submitted_attimestamp
CREATE OR REPLACE TABLE lookup_activities AS SELECT id AS code, summary AS name, parent AS type FROM crm.dbo."lookup.activity";
ColumnType
codevarchar
namevarchar
typevarchar
CREATE OR REPLACE TABLE lookup_decisions AS SELECT id AS code, name FROM crm.dbo."lookup.decision";
ColumnType
codevarchar
namevarchar
CREATE OR REPLACE TABLE lookup_prompts AS SELECT id, value AS prompt_value, category FROM crm.dbo."lookup.prompt";
ColumnType
iduuid
prompt_valuevarchar
categoryvarchar
CREATE OR REPLACE TABLE mailings AS SELECT id, subject, summary AS name, active, archived, CONCAT(folder1,'/',folder2) AS folder, method, utm_source, utm_campaign, utm_content, utm_term, utm_medium FROM crm.dbo."message.mailing";
ColumnType
iduuid
subjectvarchar
namevarchar
activeboolean
archivedboolean
foldervarchar
methodvarchar
utm_sourcevarchar
utm_campaignvarchar
utm_contentvarchar
utm_termvarchar
utm_mediumvarchar
CREATE OR REPLACE TABLE messages AS SELECT id, mailing AS mailing_id, delivered AS delivered_at, status, person as person_id FROM crm.dbo.message;
ColumnType
iduuid
mailing_iduuid
delivered_attimestamp
statusvarchar
person_iduuid

Appending a slate_instance literal to help us differentiate between grad and undg student records.

CREATE OR REPLACE TABLE persons AS SELECT id, status, created AS created_at, updated AS updated_at, 'undg' AS slate_instance FROM crm.dbo.person;
ColumnType
iduuid
statusvarchar
created_attimestamp
updated_attimestamp
CREATE OR REPLACE TABLE pings AS SELECT identity AS id, record AS person_id, url, utm_campaign, utm_source, utm_medium, timestamp AS created_at FROM crm.dbo.ping WHERE record IS NOT NULL;
ColumnType
idbigint
person_iduuid
urlvarchar
utm_campaignvarchar
utm_sourcevarchar
utm_mediumvarchar
created_attimestamp
CREATE OR REPLACE TABLE sources AS SELECT id, format AS format_id, summary, created AS created_at FROM crm.dbo.source;
ColumnType
iduuid
format_iduuid
summaryvarchar
created_attimestamp
CREATE OR REPLACE TABLE source_formats AS SELECT id, name FROM crm.dbo."source.format";
ColumnType
iduuid
namevarchar
CREATE OR REPLACE TABLE source_records AS SELECT id, source AS source_id, record AS record_id FROM crm.dbo."source.record";
ColumnType
iduuid
source_iduuid
record_iduuid
CREATE OR REPLACE TABLE statuses AS SELECT id, record AS record_id, status, timestamp AS changed_at, rank, source FROM crm.dbo.status WHERE record IS NOT NULL;
ColumnType
iduuid
record_iduuid
statusvarchar
changed_attimestamp
rankinteger
sourceuuid
CREATE OR REPLACE TABLE tags AS SELECT id, tag, record AS person_id FROM crm.dbo.tag;
ColumnType
iduuid
tagvarchar
person_iduuid
BEGIN;
CREATE OR REPLACE TABLE activities AS
SELECT id, date AS created_at, code, summary, source AS source_id, record AS person_id
FROM crm.dbo.activity;
CREATE OR REPLACE TABLE addresses AS
SELECT record AS record_id, city, county, region, country, postal AS postal_code, geomarket, type, rank_overall AS rank
FROM crm.dbo.address;
CREATE OR REPLACE TABLE applications AS
SELECT id, person AS person_id, source AS source_id, status, created AS created_at, submitted AS submitted_at
FROM crm.dbo.application;
CREATE OR REPLACE TABLE decisions AS
SELECT application AS application_id, released AS released_at, code
FROM crm.dbo.decision;
CREATE OR REPLACE TABLE fields AS
SELECT record AS record_id, field, prompt, value
FROM crm.dbo.field
WHERE record IS NOT NULL
AND field IN ('ga_id','intended_term','intended_program','utm_campaign','utm_source','utm_medium');
CREATE OR REPLACE TABLE form_responses AS
SELECT id, record AS record_id, person AS person_id, referrer AS url, utm_campaign, utm_source, utm_medium, submitted AS submitted_at
FROM crm.dbo."form.response";
CREATE OR REPLACE TABLE lookup_activities AS
SELECT id AS code, summary AS name, parent AS type
FROM crm.dbo."lookup.activity";
CREATE OR REPLACE TABLE lookup_decisions AS
SELECT id AS code, name
FROM crm.dbo."lookup.decision";
CREATE OR REPLACE TABLE lookup_prompts AS
SELECT id, value AS prompt_value, category
FROM crm.dbo."lookup.prompt";
CREATE OR REPLACE TABLE mailings AS
SELECT id, subject, summary AS name, active, archived, CONCAT(folder1,'/',folder2) AS folder, method, utm_source, utm_campaign, utm_content, utm_term, utm_medium
FROM crm.dbo."message.mailing";
CREATE OR REPLACE TABLE messages AS
SELECT id, mailing AS mailing_id, delivered AS delivered_at, status, person AS person_id
FROM crm.dbo.message;
CREATE OR REPLACE TABLE persons AS
SELECT id, status, ref AS ref_id, created AS created_at, updated AS updated_at, 'undg' AS slate_instance
FROM crm.dbo.person;
CREATE OR REPLACE TABLE pings AS
SELECT identity AS id, record AS person_id, url, utm_campaign, utm_source, utm_medium, timestamp AS created_at
FROM crm.dbo.ping
WHERE record IS NOT NULL;
CREATE OR REPLACE TABLE sources AS
SELECT id, format AS format_id, summary, created AS created_at
FROM crm.dbo.source;
CREATE OR REPLACE TABLE source_formats AS
SELECT id, name
FROM crm.dbo."source.format";
CREATE OR REPLACE TABLE source_records AS
SELECT id, source AS source_id, record AS record_id
FROM crm.dbo."source.record";
CREATE OR REPLACE TABLE statuses AS
SELECT id, record AS record_id, status, timestamp AS changed_at, rank, source
FROM crm.dbo.status
WHERE record IS NOT NULL;
CREATE OR REPLACE TABLE tags AS
SELECT id, tag, record AS person_id
FROM crm.dbo.tag;
COMMIT;