การวิเคราะห์ข้อมูลธุรกิจด้วย SQL
Michel Semaan
Data Scientist
DATE_TRUNC('quarter', '2018-08-13') → '2018-07-01 00:00:00+00:00''2018-07-01 00:00:00+00:00' :: DATE → '2018-07-01'วันที่ในรายงาน
'2018-08-13' อ่านไม่สะดวกนัก'2018-08-13' ให้เป็น 'Friday 13, August 2018' ได้อย่างไร?วิธีแก้
TO_CHAR('2018-08-13', 'FMDay DD, FMMonth YYYY') → 'Friday 13, August 2018'TO_CHAR(DATE, TEXT) → TEXT (สตริงวันที่ที่จัดรูปแบบแล้ว)ตัวอย่าง: Dy → ชื่อวันแบบย่อ (Mon, Tues, etc.)
TO_CHAR('2018-06-01', 'Dy') → 'Fri'TO_CHAR('2018-06-02', 'Dy') → 'Sat'รูปแบบในสตริงฟอร์แมตจะถูกแทนที่ด้วยค่าที่ตรงกันในวันที่ ส่วนอักขระอื่นคงเดิม
DD → หมายเลขวัน (01 - 31)TO_CHAR('2018-06-01', 'Dy - DD') → 'Fri - 01'TO_CHAR('2018-06-02', 'Dy - DD') → 'Sat - 02'| Pattern | Description |
|---|---|
FMDay |
ชื่อวันแบบเต็ม (Monday, Tuesday, etc.) |
MM |
เดือนของปี (01 - 12) |
Mon |
ชื่อเดือนแบบย่อ (Jan, Feb, etc.) |
FMMonth |
ชื่อเดือนแบบเต็ม (January, February, etc.) |
YY |
2 หลักสุดท้ายของปี (18, 19, etc.) |
YYYY |
ปีแบบ 4 หลัก (2018, 2019, etc.) |
เอกสารอ้างอิง: https://www.postgresql.org/docs/9.6/functions-formatting.html
คิวรี
SELECT DISTINCT
order_date,
TO_CHAR(order_date,
'FMDay DD, FMMonth YYYY') AS format_1,
TO_CHAR(order_date,
'Dy DD Mon/YYYY') AS format_2
FROM orders
ORDER BY order_date ASC
LIMIT 3;
ผลลัพธ์
order_date format_1 format_2
---------- ---------------------- ---------------
2018-06-01 Friday 01, June 2018 Fri 01/Jun 2018
2018-06-02 Saturday 02, June 2018 Sat 02/Jun 2018
2018-06-02 Sunday 03, June 2018 Sun 03/Jun 2018
SUM(...) OVER (...): คำนวณผลรวมสะสมของคอลัมน์SUM(registrations) OVER (ORDER BY registration_month) คำนวณผลรวมสะสมของการลงทะเบียนLAG(...) OVER (...): ดึงค่าจากแถวก่อนหน้าLAG(mau) OVER (ORDER BY active_month) คืนค่าผู้ใช้งานที่ใช้งานอยู่ของเดือนก่อนหน้า (MAU)RANK() OVER (...): กำหนดอันดับให้แต่ละแถวตามตำแหน่งในลำดับที่จัดเรียงRANK() OVER (ORDER BY revenue DESC) จัดอันดับผู้ใช้ ร้านอาหาร หรือเดือนตามรายได้คิวรี
SELECT
user_id,
SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id
ORDER BY revenue DESC
LIMIT 3;
ผลลัพธ์
user_id revenue
------- -------
18 626
76 553.25
73 537
คิวรี
WITH user_revenues AS (
SELECT
user_id,
SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id)
SELECT
user_id,
RANK() OVER (ORDER BY revenue DESC)
AS revenue_rank
FROM user_revenues
ORDER BY revenue_rank DESC
LIMIT 3;
ผลลัพธ์
user_id revenue_rank
------- ------------
18 1
76 2
73 3
การวิเคราะห์ข้อมูลธุรกิจด้วย SQL