SELECT
FROM
JOIN
WHERE
(AND)
GROUP BY
ORDER BY
LIMIT
SELECT username, count(1) as number_of_views
FROM pageviews
WHERE day = '2017-09-08'
GROUP BY username
ORDER BY username;
SELECT store_id, zipcode, revenue
FROM stores as s
WHERE revenue >=
(SELECT Avg(revenue)
FROM stores
WHERE s.zipcode = stores.zipcode)
ORDER BY zipcode;
-- 首先,找出2017年9月8日所有user_a的交易記錄
with user_a_trans as (
SELECT username, time
FROM transactions
WHERE day = '2017-09-08'
AND username = 'user_a'),
-- 將每一條交易與在它之後發生的所有交易合併在一張表格裡
joined_trans as (
SELECT username, time, future_times
FROM user_a_trans a
INNER JOIN user_a_trans b
ON b.time > a.time),
-- 使用MIN()函數找出最近的下一次交易
next_trans as (
SELECT username, time, MIN(future_times) as next_time
FROM joined_trans
GROUP BY username, time)
-- 將前一次交易與下一次交易的時間差取平均值
SELECT AVG(next_time - time) as avg_time_to_next_transactionfrom next_trans;
如果你不能很好的理解這個查詢的所有細節,完全沒關係——熟能生巧。重要的一點是,複雜的問題需要分解成多個部分,並通過一系列CTEs來解決。篩選(Filter),聚合(Aggregate),合併(Join)當你遇到像上面這樣的難題時,先花一分鐘問問自己理想的表應該是什麼樣的,才能用一個SELECT語句來解決這個問題。在上面的例子中,理想的表是有一條包含每個交易的記錄,以及還包含下一個交易時間的一列。一旦你知道了你的最終表格是什麼樣的,你就可以逆向思考,一步一步地決定如何使用一系列CTEs將你的原始表格轉換成面試官要求的最終輸出。通常,你可以對你的CTEs字符串執行以下步驟:使用WHERE進行篩選,使用GROUP BY進行聚合,使用JOIN進行合併,重複上述步驟。在合併之前先進行篩選和聚合數據,可以編寫最高效的SQL。合併的過程需要花費一定時間,因此在將兩個表聯結在一起之前,儘可能刪減掉不需要的行,只保留有需要的行。有時,會無法先進行聚合,但是你通常可以通過至少一兩個WHERE子句來限制最後要合併的表的大小。需要注意的是,如果在同一個CTE中有一個JOIN句和一個WHERE句,那麼SQL首先處理JOIN。換句話說,以下是非常低效的,因為它將先合併兩個表,之後才對「2017年1月9日」之後的時間進行篩選:SELECT *
FROM table_a a
INNER JOIN table_b b
ON a.username = b.username
WHERE a.day >= '2017-09-01'
with a as (
SELECT *
FROM table_a
WHERE day >= '2017-09-01'),
b as (
SELECT *
FROM table_b
WHERE day >= '2017-09-01')
SELECT *
FROM a
INNER JOIN b
ON a.username=b.username;
with state_totals as (
SELECT state, revenue,
SUM(revenue) OVER (PARTITION BY state) as state_revenue
FROM state_line_items)
SELECT state,
revenue/state_revenue as percent_of_state_revenue
FROM state_totals;
with sales as (
SELECT 'sale' as type
FROM sale_transactions
WHERE day >= '2017-09-01'),
buys as (
SELECT 'buy' as type
FROM buy_transactions
WHERE day >= '2017-09-01'),
unioned as (
SELECT type
FROM buys
UNION ALL
SELECT type
FROM sales)
SELECT type, count(1) as num_transactions
FROM unioned
GROUP BY type;
SELECT
CASE WHEN day_of_week in ('Sat', 'Sun')
then 'Weekend' else 'Weekday' end as day_type
FROM table_a;
SELECT
SUM(
CASE WHEN day_of_week in ('Sat', 'Sun')
THEN 1 ELSE 0 END) as num_weekend_days
FROM table_a;
Amazon專家授課 + 在線集中答疑 = 拿下你的下一場SQL面試!
MarTechApe聯合亞馬遜商務智能工程師(Amazon Business Intelligence Engineer)—— Cindy老師,開設了SQL特訓課,將行業內所需SQL技能和面試考點濃縮成6個小時的課程內容,讓你短時間就能實現SQL能力質的飛躍!
報名成功的同學還可獲贈一場Cindy老師的《如何成為亞馬遜Business Intelligence商務智能分析師》線上講座。
課程大綱
Introduction to SQL | SQL基本概念
SQL introduction, basic concept of relational database
SQL usage in work, transactional database, analysis database
SQL generations:
Oracle
SQL Server
MySQL
Postgres
Redshift
Basic SQL | 1小時SQL基本語句與功能應用
Basic SQL -1:
Basic SQL -2: Comparison
Basic SQL -3:
Boolean ( AND, OR, NOT)
ORDER BY
Basic SQL -4:
Aggregation ( COUNT, SUM, MIN, MAX, AVG),
GROUP BY
Basic SQL -5:
Basic SQL -6: Case
Intermediate SQL | 2小時SQL進階語句與功能應用
Intermediate SQL -1: Joins
NNER
OUTER
LEFT
RIGHT
JOIN USING WHERE or ON
Intermediate SQL -2:
Intermediate SQL -3:
Data types
Data format
String function
Window function
Intermediate SQL -4:
Primary key
Index
Sort key
Distribution key
SQL Interview Questions | 3小時SQL面試真題詳解
Deep dive into SQL interview questions from major Tech companies including but not limited to:
Amazon
Apple
Cracking the SQL Interviews | 2小時SQL模擬面試、答疑、面試經驗分享
Live Q&A
Interview tips on SQL online Test (e.g., Live interview, CoderPad)
SQL challenges in the real business world
Amazon亞馬遜美國擔任商務智能工程師(Business Intelligence Engineer)課程形式
3小時SQL系統性知識培訓 + 3小時SQL真題詳解錄播課程,所有內容均有視頻回放,一經購買,可永久回看。只購買3小時SQL系統性知識培訓:149美元/人
只購買3小時SQL真題特訓:149美元/人
購買6小時全套課程:249美元/人
如果需要人民幣支付,請掃描下方二維碼,聯繫小助手進行購課。想要快速提高你的SQL能力,就快來報名吧!
堅持學習,保持職場競爭力,選擇MarTechApe!