The challenge for Analytics Engineer is comprised of two parts
- A presentation on the vision for BI at Primer
- A data modelling and SQL technical exercise
- 10 minute presentation on the vision for BI - this can be a slide deck, bullet points, or a document. You should address these questions along with anything else you think is relevant.
- How do you set, monitor, and evaluate KPIs?
- How do you ensure data is accurate? What do you do if you find inaccurate data?
- How do people learn about our data/tables/reports? How would you keep data definitions updated and ensure that everyone in Primer is using the same definition?
- Would we have a self-serve data strategy? If so, what would it look like?
- What is the purpose of BI within a company?
- How are insights/reports communicated to the business?
- We have provided 4 csv files - each file represents a table in a database. Your task is to load the files into a database, create 1 table that can be used to answer the questions below, and then write the SQL to answer the questions. In total, you should submit 5 SQL queries.
-
What is the authorization rate per processor?
Authorisation Rate = Count of successfully authorised payments ÷ Count of all payments where status ≠ PENDING
A payment is considered successfully authorised if the status is one of
- AUTHORIZED
- CANCELLED
- SETTLING
- SETTLED
- PARTIALLY_SETTLED
A payment is not authorised if the status is
- DECLINED
- FAILED
Payments with a status of PENDING should not be included in the Authorisation or Decline Rate as they are pending a authorisation response
-
What is the mean number of successfully authorized payments per processor per day?
-
Which network has the most declined payments?
-
Using company_name to identify merchants, which merchants provide values for metadata?
PAYMENT_DATA
Column | Type | Nullable | Description |
---|---|---|---|
PAYMENT_ID | VARCHAR | FALSE | unique id for each payment |
CURRENCY_CODE | VARCHAR | FALSE | 3 digit currency code the payment was made in |
CUSTOMER_DETAILS | OBJECT | TRUE | contains billing and shipping information for a customer |
STATEMENT_DESCRIPTOR | VARCHAR | TRUE | Description of the what the payment is for provided by a merchant |
CREATED_AT | TIMESTAMP | FALSE | Time when payment was created |
UPDATED_AT | TIMESTAMP | FALSE | Time when payment was last updated |
TOKEN_ID | VARCHAR | FALSE | One-time use token that authenticates merchants and enables them to make payments |
VAULTED_TOKEN_ID | VARCHAR | TRUE | Multi-use token that authenticates merchants and enables them to make payments |
MERCHANT_PAYMENT_ID | VARCHAR | FALSE | Shortened payment_id used to display in the customer dashboard - there is a 1-1 mapping between payment_id and merchant_payment_id |
PRIMER_ACCOUNT_ID | VARCHAR | FALSE | Unique id for each merchant |
AMOUNT | INTEGER | FALSE | Payment amount in minor units (e.g. 100 USD would be $1) |
STATUS | VARCHAR | FALSE | The status of the payment - AUTHORIZED / CANCELLED / DECLINED / FAILED / PARTIALLY_SETTLED / PENDING / SETTLED |
PROCESSOR_MERCHANT_ID | VARCHAR | FALSE | Unique id of the merchant's processor that processes the payment |
PROCESSOR | VARCHAR | FALSE | Common name of the payment processor that processed the payment |
AMOUNT_CAPTURED | INTEGER | FALSE | Amount in lowest form that was captured |
AMOUNT_AUTHORIZED | INTEGER | FALSE | Amount in lowest form that was authorized |
AMOUNT_REFUNDED | INTEGER | FALSE | Amount in lowest form that was refunded |
PAYMENT_INSTRUMENT_TOKEN_DATA
Column | Type | Nullable | Description |
---|---|---|---|
TOKEN_ID | VARCHAR | FALSE | Token that authenticates merchants and enables them to make payments. Can be joined to payment_data using payment_data.token_id |
TOKEN_TYPE | VARCHAR | FALSE | Single Use or Multi Use |
THREE_D_SECURE_AUTHENTICATION | OBJECT | TRUE | 3ds secure data; present if 3ds challenge was presented |
PAYMENT_INSTRUMENT_TYPE | VARCHAR | FALSE | Type of instrument used to make the payment; typcially PAYMENT_CARD |
NETWORK | VARCHAR | FALSE | The payment instrument network (VISA/AMEX/MASTERCARD/etc) |
PAYMENT_REQUEST_DATA
Column | Type | Nullable | Description |
---|---|---|---|
PAYMENT_REQUEST_ID | VARCHAR | FALSE | Unique id for the payment request |
CURRENCY_CODE | VARCHAR | FALSE | 3 digit currency code the payment was made in |
CREATED_AT | TIMESTAMP | FALSE | Timestamp when the payment request was made |
PAYMENT_REQUEST_TYPE | VARCHAR | FALSE | PAYMENT_REFUND_REQUEST / PAYMENT_CAPTURE_REQUEST / PAYMENT_CREATION_REQUEST / PAYMENT_CANCEL_REQUEST |
PAYMENT_INSTRUMENT_VAULT_INTENTION | VARCHAR | TRUE | Should the payment instrument be vaulted |
PAYMENT_ID | VARCHAR | FALSE | Unique id for the payment - can be joined to payment_data using payment_data.payment_id |
PRIMER_ACCOUNT_ID | VARCHAR | FALSE | Unique id for each merchant |
METADATA | OBJECT | TRUE | Arbitrary data that merchants can provide about their payments |
PAYMENT_INSTRUMENT_TOKEN_ID | VARCHAR | FALSE | Token_id linked to the payment_instrument - can be joined to payment_instrument_token_data using payment_instrument_token_data.token_id |
AMOUNT | NUMBER | FALSE | Payment amount in minor units (e.g. 100 USD would be $1) |
MERCHANT_REQUEST_ID | VARCHAR | FALSE | Unique id for the request made from the merchant |
PRIMER_ACCOUNT
Column | Type | Nullable | Description |
---|---|---|---|
PRIMER_ACCOUNT_ID | VARCHAR | FALSE | Unique id for each merchant |
COMPANY_NAME | VARCHAR | FALSE | Name of each merchant |
CREATED_AT | TIMESTAMP | FALSE | Timestamp when the account was created for the merchant |