Pathway Analytics
  • Introduction
  • Blog
    • MMM Showdown: Google Meridian vs. PyMC Marketing
    • Drop Line Charts - Use Process Behavior Charts Instead!
    • Create a GitBook Data Science Portfolio
    • 5 Reasons I Chose Johns Hopkins Online AI Masters Program
  • Statistics
    • Google Lightweight MMM
    • Propensity Score Matching
    • Thompson Sampling
    • Basketball Free Throw Percentage App
  • Deep Learning
    • Classifying Medical Abstract Sentences
    • Predicting Bitcoin Prices
    • Food Image Classifying
  • Supervised Learning
    • Waiter Tips Multivariate Regression
    • Sleep Cycle - Analyzing My Own Sleep Data
  • Unsupervised Learning
    • Customer Segmentation using KMeans
    • Time Series Clustering
  • Dashboards, Reports, and Visualizations
    • Shiny Useful Code
    • R Markdown Reports
  • Mini Notes
    • Useful SQL Code
    • Testing Code
    • Correlation Plots
    • Docker - Jupyter Lab and R Studio Setup
    • Tensorflow GPU Setup
    • Object Oriented Programming
    • R and Python Together using Reticulate
    • Random Forests are Versatile
Powered by GitBook
On this page
  • SQL
  • Rolling Window
  • Moving Average
  • Dangers of Lag/Lead
  • Exclude Join
  • Full Join
  • Dense Rank vs. Rank vs. Row_number()
  • Fetch First 10 Rows Only
  • PL/SQL
  • Create Blank Table using Columns from Other Table
  • Create Partitions
  • Drop Partition Function
  • Insert into Append Procedure
  • Drop and Rebuild Procedure
  • Job Scheduler
  1. Mini Notes

Useful SQL Code

Last updated: 10/21/2022

SQL

Rolling Window

Moving Average

6 week moving average

SELECT LY_WEEK_OF,
       WEEK_OF,
       ROUND(AVG(LY_SPEND) OVER (ORDER BY WEEK_OF ROWS BETWEEN 7 PRECEDING AND CURRENT ROW), 0) LY_SPEND,
       ROUND(CASE WHEN WEEK_OF >= TRUNC(SYSDATE, 'IW') THEN NULL ELSE AVG(SPEND) OVER (ORDER BY WEEK_OF ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) END, 0) SPEND
       FROM SPEND_TABLE

Dangers of Lag/Lead

If a table is missing data, this can lead to all sorts of problems

Exclude Join

Below is a query to get everything from A that does not join onto B.

SELECT * FROM A
LEFT JOIN B
ON A.COLUMN = B.COLUMN
WHERE B.COLUMN IS NULL

Full Join

I used to think this function is useless and would only use left joins. Turns out there are many situations where a full join can be useful.

For example, I had a table R that had marketing revenue and a table S that had marketing spends.

This is my original query:

SELECT R.WEEK,
       R.CAMPAIGN,
       R.REVENUE,
       S.SPEND
FROM REVENUE_TABLE R
LEFT JOIN SPEND_TABLE S
ON R.WEEK = S.WEEK
AND R.CAMPAIGN = S.CAMPAIGN

Now, I can calculate ROAS because I can get REVENUE/SPENDS.

After closer look, I realized that there were some marketing spends that did not have marketing revenue (I hadn't linked them properly).

SELECT NVL(R.WEEK, S.WEEK) AS WEEK,
       NVL(R.CAMPAIGN, S.CAMPAIGN) AS CAMPAIGN,
       R.REVENUE,
       S.SPEND
FROM REVENUE_TABLE R
FULL JOIN SPEND_TABLE S
ON R.WEEK = S.WEEK
AND R.CAMPAIGN = S.CAMPAIGN

Using the full join, now I include the marketing spends that I would have missed.

Dense Rank vs. Rank vs. Row_number()

Fetch First 10 Rows Only

SELECT * FROM TABLE
FETCH FIRST 10 ROWS ONLY

PL/SQL

Create Blank Table using Columns from Other Table

CREATE TABLE NEW_TABLE AS
SELECT * FROM OTHER_TABLE
WHERE 1=2;

Create Partitions

Drop Partition Function

Insert into Append Procedure

Drop and Rebuild Procedure

Job Scheduler

BEGIN
   DBMS_SCHEDULER.CREATE_JOB(JOB_NAME            => 'USERNAME.PKG_SQL_PKG_J',
                             JOB_TYPE            => 'STORED_PROCEDURE',
                             JOB_ACTION          => 'USERNAME.PKG_SQL_PKG.LOAD_TABLES',
                             NUMBER_OF_ARGUMENTS => 0,
                             START_DATE          => TRUNC(SYSDATE)-1,
                             REPEAT_INTERVAL     => 'FREQ=WEEKLY;BYDAY=TUE;BYHOUR=11',
                             END_DATE            => NULL,
                             ENABLED             => FALSE,
                             AUTO_DROP           => FALSE,
                             COMMENTS            => '');

   DBMS_SCHEDULER.SET_ATTRIBUTE(NAME => 'USERNAME.PKG_SQL_PKG_J',
                                ATTRIBUTE => 'store_output',
                                VALUE => TRUE);

   DBMS_SCHEDULER.SET_ATTRIBUTE(NAME => 'USERNAME.PKG_SQL_PKG_J',
                                ATTRIBUTE => 'logging_level',
                                VALUE => DBMS_SCHEDULER.LOGGING_RUNS);

   DBMS_SCHEDULER.ENABLE(NAME => 'USERNAME.PKG_SQL_PKG_J');
END;
/

/* ROLLBACK */

BEGIN
   DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'USERNAME.PKG_SQL_PKG_J');
END;
/


/* SCHEDULER DETAILS */

SELECT ASJ.OWNER,
       ASJ.JOB_NAME,
       ASJ.ENABLED JOB_ENABLED,
       ASJ.STATE JOB_STATE,
       ASJ.REPEAT_INTERVAL JOB_REPEAT_INTERVAL,
       ASJ.JOB_ACTION,
       ASJ.LAST_START_DATE,
       ASJLD.LAST_RUN_END_DATE,
       ASJLD.JOB_LOG_OPERATION,
       ASJLD.JOB_LOG_STATUS,
       ASJ.LAST_RUN_DURATION,
       ASJ.NEXT_RUN_DATE,
       ASJ.RUN_COUNT,
       ASJ.FAILURE_COUNT,
       ASJ.RETRY_COUNT
FROM DBA_SCHEDULER_JOBS ASJ
LEFT OUTER JOIN (SELECT ASJL1.OWNER,
                        ASJL1.JOB_NAME,
                        ASJL1.LOG_DATE LAST_RUN_END_DATE,
                        ASJL1.OPERATION JOB_LOG_OPERATION,
                        ASJL1.STATUS JOB_LOG_STATUS,
                        ASJL2.STATUS JOB_RUN_DETAIL_STATUS
                 FROM (SELECT ASJL.OWNER,
                              ASJL.JOB_NAME,
                              MAX(ASJL.LOG_ID) LOG_ID
                       FROM DBA_SCHEDULER_JOB_LOG ASJL
                       WHERE ASJL.OWNER = 'USERNAME'
                       GROUP BY ASJL.OWNER,
                                ASJL.JOB_NAME) ROOT
                 LEFT OUTER JOIN DBA_SCHEDULER_JOB_LOG ASJL1
                 ON ROOT.LOG_ID = ASJL1.LOG_ID
                 LEFT OUTER JOIN DBA_SCHEDULER_JOB_RUN_DETAILS ASJL2
                 ON ROOT.LOG_ID = ASJL2.LOG_ID) ASJLD
ON ASJ.OWNER = ASJLD.OWNER
AND ASJ.JOB_NAME = ASJLD.JOB_NAME
WHERE ASJ.OWNER = 'USERNAME'
ORDER BY 1, 2 ASC;
PreviousR Markdown ReportsNextTesting Code

Last updated 1 year ago