สรุปขั้นตอนการตัดสินใจในการใช้ข้อมูล (data driven decision making) ด้วย SQL

Image placeholder
แวะมาทักทายกันได้


สรุปขั้นตอนการตัดสินใจในการใช้ข้อมูล (data driven decision making) ด้วย SQL - ตอนที่ 1

1️⃣ สำหรับโพสต์นี้เป็นการ recap หรือ ทวนซ้ำอีกครั้งในการใช้ SQL เพื่อการตัดสินใจในการใช้ข้อมูล เป็น บทความต่อเนื่องจาก การสำรวจข้อมูลด้วย SQL ซึ่งจะมีการใช้คำสั่งพื้นฐานที่ช่วยให้เราเข้าใจความหมายที่อยู่ในข้อมูล เพื่อนำไปสู่การหาคำตอบบางอย่างที่ต้องการรู้

2️⃣ คำสั่งที่จำเป็นในการตัดสินใจในข้อมูล จริงๆแล้ว ก็เป็นคำสั่งพื้นฐานสำหรับคนที่ใช้ SQL เพื่อติดต่อกับฐานข้อมูลอยู่เป็นประจำ อย่างเช่น

  • WHERE
  • ORDER BY
  • GROUP BY
  • AGGREGATE FUNCTION เช่น UNIQUE COUNT, MAX, MIN, AVG, SUM
  • IS NULL , IS NOT NULL

โดยคำสั่งเหล่านี้ เช่นเดียวกับการสำรวจข้อมูล แต่มองในมุมว่าเราจะตัดสินใจในการใช้ข้อมูลได้อย่างไร

3️⃣ คราวนี้มาทำความเข้าใจกับคำว่า การตัดสินใจในการใช้ข้อมูลกันก่อน

4️⃣การตัดสินใจในการใช้ข้อมูล (data driven decision making) คือกระบวนการใช้ข้อมูลเพื่อการตัดสินใจ หรือ ปรับปรุงการตัดสินใจให้ดีขึ้น โดยการรวบรวม การวิเคราะห์ การตีความข้อมูลเพื่อระบุ รูปแบบการเปลี่ยนแปลง หรือ แนวโน้มในเหตุการณ์ต่างๆในข้อมูลที่เกิดขึ้น ให้สามารถตัดสินใจได้ดีกว่าเดิม ซึ่งสามารถนำไปใช้ บรรลุเป้าหมายได้หลายอย่าง

5️⃣ การปรับปรุงประสิทธิภาพในการทำงาน

การตัดสินใจ โดยใช้ข้อมูลสามารถช่วยเหลือธุรกิจเชิงพื้นที่ และ ปรับปรุงประสิทธิภาพและผลผลิตได้ หรือ ธุรกิจอาจจะใช้การตัดสินใจโดยใช้ข้อมูลเพื่อระบุว่าผลิตภัณฑ์ใดทำกำไรได้มากที่สุด ตลาดแห่งไหนมีประสิทธิภาพดีกว่ากัน เป็นต้น

6️⃣การตัดสินใจเชิงกลยุทธ์

การตัดสินใจโดยใช้ข้อมูลยังสามารถช่วยเหลือธุรกิจในการตัดสินใจเชิงกลยุทธ์ เช่น ผลิตภัณฑ์ตัวไหนสามารถพัฒนาได้ตรงตามความต้องการของลูกค้า หรือ สามารถจัดสรรทรัพยากรต่างๆ ให้เหมาะสม ทั้งเวลา ค่าใช้จ่าย เป็นต้น

7️⃣การลดความเสี่ยง

ช่วยลดความเสี่ยงโดยการระบุปัญหาที่อาจเกิดขึ้นในแต่ละช่วง ใช้ข้อมูลระบุว่า ลูกค้าคนไหนจะเลิกใช้บริการ หรือ ซัพพลายเออร์มีความเสี่ยงที่จะเลิกกิจการ เป็นต้น

8️⃣ในโลกปัจจุบัน ข้อมูลที่มีปริมาณเพิ่มขึ้น รวมถึง platform ค้าขายหรือที่เรียกว่า e-commerce ก็ให้บริการในส่วนของการวิเคราะห์ข้อมูลมากขึ้น เพื่อช่วยในการตัดสินใจ เพื่อนำไปสู่ประสิทธิภาพในการดำเนินงาน และ ลดความเสี่ยง

9️⃣ โดยสรุปแล้ว

การตัดสินใจโดยใช้ข้อมูลเป็นเครื่องมือทรงพลังที่สามารถใช้ในอุตสาหกรรมต่างๆ เพื่อปรับปรุงการตัดสินใจ ธุรกิจ เพื่อบรรลุเป้าหมายได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้การตัดสินใจโดยใช้ข้อมูล

???? ยกตัวอย่าง

???? การ filter ข้อมูลเพื่อระบุเฉพาะที่ต้องการจะทราบด้วย WHERE

SELECT *
FROM renting
WHERE date_renting = '2018-10-09'; -- Movies rented on October 9th, 2018


???? ค้นหาแบบ ช่วงด้วย BETWEEN AND

SELECT *
FROM renting
WHERE date_renting BETWEEN '2018-04-01' AND '2018-08-31'; -- from beginning April 2018 to end August 2018


???? ค้นหาแบบ เฉพาะเจาะจง แบบเลือก ด้วย IN ()

SELECT *
FROM movies
WHERE title IN ('Showtime', 'Love Actually', 'The Fighter'); -- Select all movies with the given titles


???? การ arrgregate เพื่อคำนวนค่าต่างๆ ด้วย COUNT

SELECT COUNT(customer_id) -- Count the total number of customers
FROM customers
WHERE date_of_birth BETWEEN '1980-01-01' AND '1989-12-31' ; -- Select customers born between 1980-01-01 and 1989-12-31


???? การ arrgregate เพื่อคำนวนค่าต่างๆ ด้วย MIN, MAX, AVG

SELECT MIN(rating) AS min_rating, -- Calculate the minimum rating and use alias min_rating
	   MAX(rating) AS max_rating, -- Calculate the maximum rating and use alias max_rating
	   AVG(rating) AS avg_rating, -- Calculate the average rating and use alias avg_rating
	   COUNT(rating) AS number_ratings -- Count the number of ratings and use alias number_ratings
FROM renting
WHERE movie_id = 25 ; -- Select all records of the movie with ID 25



สรุปขั้นตอนการตัดสินใจในการใช้ข้อมูล ด้วย SQL - ตอนที่ 2

1️⃣ ในโพสต์ที่แล้ว สรุปขั้นตอนการตัดสินใจในการใช้ข้อมูล ด้วย SQL - ตอนที่ 1 ได้เขียนถึง กระบวนการใช้ข้อมูลเพื่อการตัดสินใจเบื้องต้น แนวคิด และ คำสั่งที่จำเป็นแบบพื้นฐานเพื่อใช้ข้อมูลที่ช่วยปรับปรุงการตัดสินใจให้ดีขึ้น แต่สำหรับโพสต์นี้จะเขียนถึงแนวทางในการเลือกวิธีการเพื่อสำรวจข้อมูลไปจนถึงการตัดสินใจใช้ข้อมูลนั้นๆ

2️⃣ ในชีวิตประจำวัน หลายๆครั้ง เรามักจะใช้การตัดสินใจในหลายๆเรื่อง ไม่ว่าจะเป็น การเปรียบเทียบราคาก่อนการซื้อสินค้า การเลือกลงทุนในธุรกิจ กองทุน หุ้น เป็นต้น

3️⃣ ซึ่งก่อนที่จะตัดสินใจอะไรบางอย่างได้นั้น อาจจะใช้การพิจารณาโดยการเห็นภาพรวมของทุกอย่างก่อน จึงจะสรุปออกมาได้ ดังนั้น ในการสำรวจข้อมูล กับ การตัดสินใจในข้อมูลมักจะมาคู่กันเสมอ แต่ขั้นตอนก่อนจะตัดสินใจได้ การสำรวจข้อมูลจะเริ่มก่อนเพื่อให้เห็นภาพรวมทั้งหมด จึงจะทำให้ตัดสินใจในข้อมูลที่มีอยู่ได้

4️⃣ ในการใช้ SQL เพื่อการตัดสินใจในการใช้ข้อมูล ก็ไม่ต่างกันในแนวคิด แต่แนวทาง จะค่อนข้างที่จะต้องเข้าใจขั้นตอน การเลือกใช้คำสั่ง และ เทคนิคต่างๆ ซึ่งมีหลากหลายวิธี ที่ต้องใช้ทำการสำรวจ ก่อนที่จะตัดสินใจในการใช้ข้อมูลได้ เช่น

  • การจัดกลุ่ม
  • การดูความสัมพันธ์ต่างๆ ในชุดข้อมูล
  • การสรุปข้อมูล
  • การระบุความสนใจในข้อมูล

5️⃣โดยเทคนิคต่างๆ ที่กล่าวถึงนั้น ไม่จำเป็นต้องเรียงลำดับ สามารถที่จะเลือก วิธีการมาใช้แล้วสำรวจข้อมูลเพื่อตัดสินใจได้ทันที แต่บางครั้ง ก็จำเป็นที่จะต้องใช้หลายๆวิธี ร่วมกัน โดยในโพสต์นี้ เขียนหลักๆ อยู่ 2 เรื่อง คือ การจัดกลุ่ม (Grouping) และ การดูความสัมพันธ์ต่างๆ ในชุดข้อมูล (Joining) โดยการสรุปข้อมูลและการระบุข้อมูลได้กล่าวไปบ้างแล้วในโพสต์ที่ผ่านมา

6️⃣ การจัดกลุ่ม

การจัดกลุ่ม ใน SQL นั้นจะใช้ คำสั่งว่า GROUP BY เป็นคำสั่งที่ช่วยจัดกลุ่มของข้อมูลที่เหมือนกัน เพื่อช่วยดูค่าทางสถิติ ในกลุ่มของข้อมูลนั้นๆ ยกตัวอย่างเช่น เพื่อประเมินความสำเร็จและศักยภาพของบริษัท ในการสำรวจข้อมูลกลุ่มลูกค้าซึ่งเราอาจจะสนใจในการจัดกลุ่มความสามารถปริมาณรายจ่ายในการชำระสินค้า จัดกลุ่มการซื้อขายตาม อายุ ประเทศ หรือ เพศ เป็นต้น

7️⃣ HAVING เป็นคำสั่งที่ช่วยกรองข้อมูลหรือค้นหาข้อมูลตามเงื่อนไขที่ต้องการ โดยเกิดจากการจัดกลุ่ม GROUP BY ที่คล้ายกับคำสั่ง WHERE ที่ใช้กับการกรองข้อมูลจากคำสั่ง SELECT

8️⃣ โดยสรุปแล้ว GROUP BY และ HAVING เป็นเครื่องมือในการใช้ สำรวจข้อมูลเพื่อการตัดสินใจโดยการจัดกลุ่มข้อมูลที่เหมือนๆกันในชุดข้อมูล

9️⃣ ยกตัวอย่าง ข้อมูลการเช่าวิดีโอภาพยนต์

สมมติว่า เราอยากรู้ว่าข้อมูล Rating ตามประเภทของภาพยนต์ที่ผู้เช่าให้ไว้เป็นอย่างไรบ้าง เช่น มีค่าเฉลี่ย ของ rating ของแต่ละประเภทอยู่เท่าไร เป็นต้น

????ใช้คำสั่ง

SELECT title, genre, 
       AVG(rating_price)    -- Calculate average rating per movie
FROM renting
GROUP BY genre;

1️⃣1️⃣ อย่างที่ได้กล่าวไปในตอนต้น

การสำรวจข้อมูล กับ การตัดสินใจในข้อมูลมักจะคู่กัน แต่ ในการสำรวจข้อมูลจะมาก่อนเสมอ เมื่อเห็นข้อมูลภาพรวมทั้งหมด จึงจะทำให้ตัดสินใจในข้อมูลที่มีอยู่ได้

1️⃣2️⃣ยกตัวอย่าง ในเคสนี้

ในบางครั้ง เราอาจจะยังไม่สามารถตั้งคำถามอะไรได้เลย แต่มีข้อมูลอยู่ในมือ สามารถที่จะดูข้อมูลในภาพรวมก่อน แล้ว จึงตั้งคำถาม สมมติว่าเรามีข้อมูลอยู่แล้วใช้คำสั่งตามด้านล่างนี้

SELECT movie_id, 
       AVG(rating)    -- Calculate average rating per movie
FROM renting
GROUP BY movie_id;

1️⃣3️⃣ ยังไม่สามารถเชื่อได้ทันที ต้องดูข้อมูลประเภทประกอบควบคู่กันไป จากข้อมูลที่เห็นจะเป็นค่าเฉลี่ย ให้เราทำการเพิ่ม จำนวนของผู้เช่าที่ให้ rating เอาไว้ กับ จำนวนการเช่าภาพยนต์แต่ละเรื่อง

SELECT movie_id, 
       AVG(rating) AS avg_rating, -- Use as alias avg_rating
       COUNT(rating) AS number_rating,                -- Add column for number of ratings with alias number_rating
       COUNT(renting_id) AS number_renting                 -- Add column for number of movie rentals with alias number_renting
FROM renting
GROUP BY movie_id;


1️⃣4️⃣ ข้อมูลมีจำนวนอยู่ 71 แถว ลองเลื่อนลงมาดูด้านล่างสุด จะเห็นว่ามีค่า Null ซ่อนอยู่ มาถึงจุดนี้ มาลองตอบคำถามกันดูสักหน่อย ว่า จากข้อมูลที่เห็นนี้ จะตอบกันว่าอย่างไร

1️⃣5️⃣ โจทย์ถามว่า คำตอบใดเป็นจริงเมื่อภาพยนต์ลำดับที่ 11 มีค่าเฉลี่ยเป็น Null

  1. จำนวนของ number_rating มีค่าเท่ากับ 6
  2. จำนวนการเช่าภาพยนต์มีค่าเท่ากับ 0
  3. ค่าเฉลี่ยที่เป็น Null เพราะว่ามีค่า rating เท่ากับ Null
  4. ค่าเฉลี่ยที่เป็น Null เพราะว่า ค่า rating ทั้งหมดมีค่าเท่ากับ Null

1️⃣6️⃣ เพื่อนๆคิดว่าคำตอบไหนถูกต้อง ลองคอมเม้นทิ้งไว้หน่อยนะครับ ถ้ามี comment รวมทั้งหมดมากกว่า 50 comment จะมาเฉลยที่ถามไว้ใน Post นี้

1️⃣7️⃣ การดูความสัมพันธ์ต่างๆ ในชุดข้อมูล

ในโลกของข้อมูลในรูปแบบตารางและจัดเก็บข้อมูลเหล่านั้นเอาไว้ในฐานข้อมูล มีข้อดีหลายๆ อย่าง และจำเป็นที่จะต้องเข้าใจคำศัพท์ที่เกี่ยวข้องเกี่ยวกับการสร้างตารางข้อมูลขึ้นมา โดยเรียกว่า Data Modeling ประกอบไปด้วยเรื่องการสร้างความสัมพันธ์ในตารางข้อมูลต่างๆ ด้วยเหตุผลต่างๆ ดังนี้

  • ประหยัดเนื้อที่ในการจัดเก็บ
  • จัดเก็บเป็นหมวดหมู่
  • แยกประเภทในการจัดเก็บข้อมูล
  • ช่วยให้การจัดเก็บข้อมูล เป็นมาตรฐาน ง่ายต่อการวิเคราะห์
  • ช่วยลดความผิดพลาดในการนำเข้าข้อมูล

1️⃣8️⃣ แต่ด้วยข้อดีต่างๆ นี้จะต้องสร้างความสัมพันธ์ให้กับตารางที่ แยกออกจากกัน และเมื่อนำข้อมูลมาวิเคราะห์ หรือ สำรวจข้อมูลเพื่อใช้ในการตัดสินใจ จะต้องนำมา join table กันก่อน ซึ่งคำสั่งที่ผ่านมามักจะใช้กับข้อมูลที่มีอยู่เพียงตารางเดียว

1️⃣9️⃣ คำสั่ง JOIN ช่วยให้เราสามารถรวมข้อมูลจากตารางหลายตารางเข้าด้วยกัน ซึ่งสามารถใช้เพื่อวัตถุประสงค์ต่างๆ เช่น

  • เห็นข้อมูลที่ครบถ้วนของลูกค้า รวมถึงประวัติการสั่งซื้อและข้อมูลติดต่อ
  • ระบุสินค้าที่ได้รับความนิยมมากที่สุดในกลุ่มลูกค้าที่แตกต่างกัน

2️⃣0️⃣ ยกตัวอย่างเช่น การ join ตารางของ customers ลูกค้า กับ ตาราง renting การเช่าภาพยนต์ เข้าด้วยกันเพื่อดูค่าเฉลี่ยของ ผู้เช่าหนังในประเทศ Belgium เป็นต้น

SELECT AVG(rating) -- Average ratings of customers from Belgium
FROM renting AS r
LEFT JOIN customers AS c
ON r.customer_id = c.customer_id
WHERE c.country='Belgium';

2️⃣1️⃣ ตารางการเช่าภาพยนต์ renting

2️⃣2️⃣ ตารางข้อมูลลูกค้า customer

2️⃣3️⃣ ผู้เช่าในประเทศ Belgium ให้ rating อยู่ที่ 8.9

2️⃣4️⃣ นอกจากการใช้คำสั่ง Join แล้ว ยังมีเทคนิคที่เรียกว่า Sub-Queries (คำสั่งย่อย) ซึ่ง การใช้คำสั่ง Subquery และ การ Join table นั้นเป็นการ ดึงข้อมูลที่มีความสัมพันธ์จากหลายตารางเหมือนกัน แต่ทั้งสองวิธีมีข้อแตกต่างและเหตุผลในการเลือกใช้ ดังนี้

2️⃣5️⃣ เหตุผลในการเลือกใช้ Subquery

  • ประสิทธิภาพ Subquery อาจมีประสิทธิภาพมากกว่าการ Join Table เมื่อทำงานกับชุดข้อมูลขนาดเล็ก เนื่องจาก Subquery จะถูกดำเนินการแยกต่างหากและผลลัพธ์จะถูกใช้เพื่อการกรองข้อมูลอีกที
  • ความยืดหยุ่น Subquery สามารถใช้ในการดึงข้อมูลจากตารางใดก็ได้โดยไม่ต้องสร้างความสัมพันธ์ระหว่างตาราง
  • ความซับซ้อน Subquery สามารถใช้ในการเขียน Query ที่ซับซ้อนได้

2️⃣6️⃣ เหตุผลในการเลือกใช้ Join Table

  • ประสิทธิภาพ Join Table จะมีประสิทธิภาพมากกว่า Subquery เมื่อทำงานกับชุดข้อมูลขนาดใหญ่ เนื่องจาก Join Table จะดำเนินการ Query ในครั้งเดียว
  • ความชัดเจน Join Table ช่วยให้เข้าใจได้ง่ายว่าข้อมูลมาจากตารางใดบ้าง
  • ความถูกต้อง Join Table ช่วยลดโอกาสเกิดข้อผิดพลาดในการเขียน Query

2️⃣8️⃣ และข้อมูลการเช่า


2️⃣9️⃣ เมื่อใช้ subquery

SELECT rm.title, -- Report the income from movie rentals for each movie 
       SUM(rm.renting_price) AS income_movie
FROM
       (SELECT m.title,  
               m.renting_price
       FROM renting AS r
       LEFT JOIN movies AS m
       ON r.movie_id=m.movie_id) AS rm
GROUP BY title
HAVING title IN ('Django Unchained', 'The Kingdom', 'Simone')
ORDER BY title; -- Order the result by decreasing income


3️⃣0️⃣ อยากทราบว่ารายได้จากการเช่าภาพยนต์ของเรื่อง Django Unchained ไม่ถูกต้อง

  • รายได้จากภาพยนต์เรื่องนี้อยู่ที่ 29.59
  • รายได้จากภาพยนต์เรื่อง Django Unchained มีรายได้ต่ำกว่า The Kingdom
  • รายได้จากภาพยนต์เรื่อง Django Unchained มีรายได้สูงกว่า The Kingdom
  • Django Unchained อยู่ที่ อันดับที่ 5 ของภาพยนต์ที่มีรายได้สูงสุด


สรุปขั้นตอนการตัดสินใจในการใช้ข้อมูลที่เกี่ยวข้องกัน ด้วย SQL Nested query - ตอนที่ 3

1️⃣จากโพสต์ที่แล้ว ในการสำรวจข้อมูลก่อนการตัดสินใจนั้น นอกจากการดูความสัมพันธ์ของตารางข้อมูลต่างๆ เรายังสามารถที่จะใช้เทคนิคดูความเกี่ยวข้องกันระหว่างข้อมูลในตารางได้ด้วยใช้ sub query หรือ คำสั่งสอบถามแบบซ้อน (Nest)

2️⃣ทวนซ้ำกับการใช้คำสั่ง Subquery เหตุผลต่างๆ ระหว่างการใช้ sub query และ การ Join table นั้น ทั้ง 2 วิธี เป็นการ ดึงข้อมูลที่มีความสัมพันธ์จากหลายตารางเหมือนกัน แต่ทั้งสองวิธีมีเหตุผลในการเลือกใช้ไม่เหมือนกัน ดังนี้

3️⃣เหตุผลในการเลือกใช้ Subquery

  • ประสิทธิภาพ Subquery อาจมีประสิทธิภาพมากกว่าการ Join Table เมื่อทำงานกับชุดข้อมูลขนาดเล็ก เนื่องจาก Subquery จะถูกดำเนินการแยกต่างหากและผลลัพธ์จะถูกใช้เพื่อการกรองข้อมูลอีกที
  • ความยืดหยุ่น Subquery สามารถใช้ในการดึงข้อมูลจากตารางใดก็ได้โดยไม่ต้องสร้างความสัมพันธ์ระหว่างตาราง
  • ความซับซ้อน Subquery สามารถใช้ในการเขียน Query ที่ซับซ้อนได้

4️⃣เหตุผลในการเลือกใช้ Join Table

  • ประสิทธิภาพ Join Table จะมีประสิทธิภาพมากกว่า Subquery เมื่อทำงานกับชุดข้อมูลขนาดใหญ่ เนื่องจาก Join Table จะดำเนินการ Query ในครั้งเดียว
  • ความชัดเจน Join Table ช่วยให้เข้าใจได้ง่ายว่าข้อมูลมาจากตารางใดบ้าง
  • ความถูกต้อง Join Table ช่วยลดโอกาสเกิดข้อผิดพลาดในการเขียน Query

5️⃣เหตุผลที่เลือกใช้ Subquery อีกข้อ บางครั้งในการใช้ Join Table อาจจะต้องรู้ความสัมพันธ์ของตารางก่อน แต่ Subquery จะใช้วิธีการสำรวจ ค่อยๆสำรวจไปทีละขั้นตอน และ เชื่อมข้อมูลไปเรื่อยๆ จนกว่าจะได้คำตอบที่ต้องการ สามารถใช้ในการดึงข้อมูลที่ซับซ้อนและเฉพาะเจาะจงมากขึ้น

6️⃣เทคนิคขั้นตอนที่จะต้องใช้การทำ nest query ได้แก่

  • วิธีดูความเกี่ยวข้องกันของข้อมูลด้วยการทำ nested
  • สอบถามข้อมูล (Queries) ด้วยคำสั่ง EXISTS
  • สอบถามข้อมูล (Queries) UNION ด้วยคำสั่ง INTERSECT

7️⃣วิธีดูความเกี่ยวข้องกันของข้อมูลด้วยการทำ nested

อย่างที่เกริ่นไปในตอนต้น เราจะใช้วิธีสำรวจข้อมูลไปเรื่อยๆ จนกว่าจะได้คำตอบ เช่น สมมติว่าเราอยากจะรู้ค่าเฉลี่ยของ rating ภาพยนต์ที่ลูกค้าได้เช่าภาพยนต์ไปทั้งหมดเท่าไร แต่เริ่มต้นมี ตารางข้อมูลอยู่ 2 ตาราง ได้แก่

8️⃣movies table ตารางข้อมูลภาพยนต์

9️⃣renting table ****ตารางข้อมูลผู้เช่าภาพยนต์


????เริ่มจากการที่ ดูค่าเฉลี่ยทั้งหมดของตารางข้อมูลผู้เช่าภาพยนต์ เป็นค่าเฉลี่ยรวมทุกรายการ หรือ ค่ากลางของข้อมูลทั้งหมด อยู่ที่ 7.93

SELECT AVG(rating) -- Calculate the total average rating
FROM renting


1️⃣1️⃣ จากนั้นใช้ คำสั่งที่แล้วมาเป็น sub-query อยู่ที่ HAVING โดยตั้งเงื่อนไขว่า ให้ดึงข้อมูลค่าเฉลี่ยที่มีค่าสูงกว่าค่าเฉลี่ยกลางขึ้นมาแสดง ในทีนี้เราสามารถที่เปรียบเทียค่าเฉลี่ยตามรายการ มีค่าแตกต่างจาก รายการทั้งหมดอยู่เท่าไรได้

SELECT movie_id, -- Select movie IDs and calculate the average rating 
       AVG(rating)
FROM renting
GROUP BY movie_id
HAVING AVG(rating) >           -- Of movies with rating above average
	(SELECT AVG(rating)
	FROM renting);


1️⃣2️⃣หลังจากที่เราได้ Id ของ ภาพยนต์แต่ละเรื่องที่มีค่าเฉลี่ยสูงกว่า ค่าเฉลี่ยกลางหรือค่าเฉลี่ยทั้งหมด โดยการนำ Id ไปดูชื่อของภาพยนต์ได้

SELECT title -- Report the movie titles of all movies with average rating higher than the total average
FROM movies
WHERE movie_id IN
	(SELECT movie_id
	 FROM renting
     GROUP BY movie_id
     HAVING AVG(rating) > 
		(SELECT AVG(rating)
		 FROM renting));


1️⃣3️⃣ จากขั้นตอนที่ผ่านมา จะเห็นว่าเป็นการทำการ query ทีละขั้นตอนไปจนกว่าจะได้คำตอบ

นอกจากนี้ เรายังสามารถที่จะใช้คำสั่ง EXISTS และ UNION หรือ INTERSECT เพื่อใช้ในการ รวมข้อมูลที่เหมือนกัน หรือ ต่างกันได้ เช่น

1️⃣4️⃣ การใช้คำสั่ง EXITST เพื่อดูรายการที่มีอยู่ในเงื่อนไข

SELECT *
FROM customers AS c -- Select all customers with at least one rating
WHERE EXISTS
	(SELECT *
	FROM renting AS r
	WHERE rating IS NOT NULL 
	AND r.customer_id = c.customer_id);


1️⃣5️⃣ การใช้คำสั่ง UNION เพื่อรวมรายการที่มีอยู่ในเงื่อนไข

SELECT name, 
       nationality, 
       year_of_birth
FROM actors
WHERE nationality <> 'USA'
UNION -- Select all actors who are not from the USA and all actors who are born after 1990
SELECT name, 
       nationality, 
       year_of_birth
FROM actors
WHERE year_of_birth > 1990;

1️⃣6️⃣ การใช้คำสั่ง INTERSECT เพื่อแยกรายการที่มีอยู่ในเงื่อนไข

SELECT name, 
       nationality, 
       year_of_birth
FROM actors
WHERE nationality <> 'USA'
INTERSECT -- Select all actors who are not from the USA and who are also born after 1990
SELECT name, 
       nationality, 
       year_of_birth
FROM actors
WHERE year_of_birth > 1990;


สรุปขั้นตอนการตัดสินใจกับการสรุปข้อมูลด้วย OLAP SQL - ตอนที่ 4 (จบ)


1️⃣ จากโพสต์ที่แล้ว ได้ทำการสำรวจข้อมูล พร้อมกับดูความเกี่ยวข้องกันระหว่างข้อมูลในตารางได้ด้วยการใช้ sub query หรือ คำสั่งสอบถามแบบซ้อน (Nest Query) คราวนี้ เราจะนำวิธีการต่างๆ จากโพสต์ที่ผ่านมา มาใช้ร่วมกับ คำสั่งสำหรับการวิเคราะห์โดยเฉพาะ ที่เรียกกันว่า OLAP (Online Analytical Processing)

2️⃣ OLAP เป็นชุดคำสั่งที่ใช้สำหรับวิเคราะห์ข้อมูลจำนวนมาก มีความสามารถในการรวมข้อมูลได้หลายแบบมาผสมรวมกันให้เห็นข้อเปรียบเทียบของ output ที่ออกมา ซึ่ง OLAP จะมีหลายคำสั่งหรือที่เรียกว่าโอเปอร์เรเตอร์ ประกอบไปด้วย

  • CUBE
  • ROLLUP
  • GROUPING SETS

3️⃣ มาทำความรู้จักกับโอเปอร์เรเตอร์ ตัวแรกกันกับ CUBE

4️⃣CUBE ตามชื่อให้มองว่ามันคือ ข้อมูลที่มีมิติแบบลูกบาศก์ หรือ โครงสร้างข้อมูลที่มีหลายมิติสำหรับวิเคราะห์ (pivot table) เป็นการรวมข้อมูลมากกว่า 2 มิติ เพื่อดู มิติอื่นๆหรือ มิติที่ 3 โดยการใช้ค่าทางสถิติ

5️⃣ ลองยกตัวอย่างเพื่อให้เห็นภาพมากขึ้น ตามลำดับขั้นตอนโดย มีตารางข้อมูลชื่อ customers table โดยจะใช้ column country และ gender เป็น column สำหรับเปรียบเทียบการใช้คำสั่ง CUBE กัน


6️⃣ ใช้คำสั่ง GROUP BY เพื่อดูจำนวนของประเทศในชุดข้อมูล เป็นการนับข้อมูลที่ column country มีคำ หรือประเทศที่ซ้ำๆกันนับเป็นจำนวนที่ column count

SELECT country, -- Extract information of a pivot table of gender and country for the number of customers
	   COUNT(*)
FROM customers
GROUP BY country
ORDER BY country;


7️⃣ ลองใช้กับ gender กันบ้าง สังเกตว่าจากตาราง customer ที่ column gender จะรวมเพศที่ซ้ำกัน

SELECT  -- Extract information of a pivot table of gender and country for the number of customers
	   gender,
	   COUNT(*)
FROM customers
GROUP BY gender
ORDER BY gender;


8️⃣ อย่างที่เกริ่นไปในตอนต้น การใช้ CUBE เหมือนกับการทำ pivot table เป็นการรวมแกนหรือมิติมากกว่า 2 มิติเพื่อดูมิติอื่นๆ ในตัวอย่างนี้เป็นการรวม country และ gender เพื่อดูจำนวนของแถวที่มีค่าซ้ำกัน ตามการ map ข้อมูล ระหว่าง 2 column

SELECT country, -- Extract information of a pivot table of gender and country for the number of customers
	   gender,
	   COUNT(*)
FROM customers
GROUP BY CUBE (country, gender)
ORDER BY country;


9️⃣ มาทำความรู้จักกับโอเปอร์เรเตอร์ ตัวที่สองกันกับ ROLLUP

???? ROLLUP เหมือนกับ CUBE เลย แต่ต่างกันตรงที่ตอนที่สร้าง จะรวมข้อมูล (UNION) กับ column เดี่ยวๆแยกออกมาด้วย และสามารถที่จะเรียงลำดับของ column ที่กำหนดใน GROUP BY ได้

1️⃣1️⃣ ลองยกตัวอย่างเพื่อให้เห็นภาพมากขึ้น ในชุดคำสั่งนี้ จะประกอบไปด้วย column - country และ genre ซึ่ง ทั้ง 2 column ถูกนับแบบทั้ง 2 column map รวมกัน

SELECT 
	c.country, -- Select country
	m.genre, -- Select genre
	AVG(r.rating), -- Average ratings
	COUNT(*)-- Count number of movie rentals
FROM renting AS r
LEFT JOIN movies AS m
ON m.movie_id = r.movie_id
LEFT JOIN customers AS c
ON r.customer_id = c.customer_id
GROUP BY c.country, m.genre -- Aggregate for each country and each genre
ORDER BY c.country, m.genre;


1️⃣2️⃣ แต่เมื่อใช้คำสั่ง ROLLUP สั่งเกตว่าจะมีอยู่ 1 แถวในภาพนี้มี country column ที่มีข้อมูลื่อ Austria และ genre column เป็นค่า null ซึ่งหมายถึง นับเฉพาะค่าที่มีแต่ country column เท่านั้น

SELECT 
	c.country, -- Select country
	m.genre, -- Select genre
	AVG(r.rating), -- Average ratings
	COUNT(*)  -- Count number of movie rentals
FROM renting AS r
LEFT JOIN movies AS m
ON m.movie_id = r.movie_id
LEFT JOIN customers AS c
ON r.customer_id = c.customer_id
GROUP BY ROLLUP (c.country, m.genre) -- Aggregate for each country and each genre
ORDER BY c.country, m.genre;


1️⃣3️⃣ มาทำความรู้จักกับโอเปอร์เรเตอร์ ตัวสุดท้าย กันกับ GROUPING SETS

1️⃣4️⃣ GROUPING SETS เป็นโอเปอเรเตอร์ OLAP ที่ยืดหยุ่นที่สุด สามารถระบุการรวมข้อมูล (UNION) ตามที่ต้องการรวมไว้ในตารางผลลัพธ์ได้ ซึ่งหมายถึง จะ map หลาย column หรือ แยก column โดยการ UNION ผลลัพท์ทั้งหมดมาแสดงผล

1️⃣5️⃣ ยกตัวอย่าง ที่คำสั่ง GROUP BY จะเลือกการ map column มาแสดงผลโดยการ UNION ค่าทั้งหมด ส่วน วงเล็บจะหมายถึง ค่าทั้งหมดใน ตาราง ก็คือไม่ map column ใดๆ

SELECT 
	c.country, 
    c.gender,
	AVG(r.rating)
FROM renting AS r
LEFT JOIN customers AS c
ON r.customer_id = c.customer_id
-- Report all info from a Pivot table for country and gender
GROUP BY GROUPING SETS ((country, gender), (country), (gender), ());


???? สุดท้ายนี้ เป็นอย่างไรกันบ้างครับ กับ บทความทั้ง 4 บทในเรื่องของการตัดสินใจใช้ ข้อมูล data-driven-decision-making-in-sql อยากขอความคิดเห็นว่า เขียนดีมั้ย ตัวอย่างเป็นอย่างไร อยากให้เพิ่มเติมอะไรหรือไม่ อยากอ่านเรื่องอะไรกันบ้าง comment บอกกันได้เลยครับ

????  หากใครไม่อยากพลาดโพสต์เรื่องเกี่ยวกับ data analyst, data science, data engineer และ programming ในโพสต์ถัดๆไป ฝากแชร์ และ กดติดตาม profile กันไว้ด้วยนะครับ


แวะมาทักทายกันได้
donate