5 ตัวอย่าง Window Functions ที่ช่วยยกระดับทักษะ SQL ของคุณ

06-พ.ค.-22

คัมภีร์เทพ IT

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

Window Functions คืออะไร

Window Functions คือ Functions ที่ทำการคำนวณผ่าน Rows ต่าง ๆ ของ Dataset โดยที่ยังคงรักษา Rows และจำนวน Rows ใน Original Table ให้อยู่คงเดิม

สำหรับตัวอย่าง Code ที่ใช้ในบทความนี้ จะใช้ SQLite Sandbox Database: https://www.sql-practice.com/

1. Window Function แรกของคุณ

สิ่งสำคัญที่ต้องคำนึงถึงเมื่อพยายามทำความเข้าใจ Window Functions ก็คือ Window Functions จะยังคงเก็บรักษา Rows ดั้งเดิมของ Table ไว้

ในตัวอย่างนี้คือ นี่น่าจะเป็นหนึ่งใน Use Cases ที่ง่าย ๆ ของ Window Function และดังที่กล่าวไว้ หากคุณมีความเชี่ยวชาญในตัวอย่างแรกนี้ คุณจะสามารถใช้ Pattern นี้กับ Use Cases ต่าง ๆ ได้มากมาย แน่นอนว่าความสามารถของคุณในการจัดการข้อมูลใน SQL จะก้าวหน้าขึ้นอย่างแน่นอน

ก่อนอื่น จะขออธิบายว่า ผลลัพธ์ของ Window Function ที่อยู่ด้านบนคืออะไร ผลลัพธ์นี้จะได้จำนวน Rows ที่เท่าเดิมและใน Column สุดท้ายของคุณจะแสดง Weight ที่มีค่าสูงสุดตาม City ซึ่งหมายความว่า หาก City ปรากฏขึ้นมากกว่าหนึ่งครั้ง Weight ก็จะถูกแสดงซ้ำ(Duplicate) ซึ่งค่า Duplicate แบบนี้ มักเกิดขึ้นบ่อยครั้งกับ Window Function เนื่องจากเรากำลังดำเนินการรวมโดยไม่ยุบ Rows ใด ๆ ใน Table

นี่คืออีก Query ที่ให้ผลลัพธ์เหมือนกันทุกประการกับข้างต้น ในรูปแบบที่ยาวขึ้นและต้องใช้การประมวลผลที่มากขึ้นกว่าเดิม หวังว่านี่จะช่วยให้คุณเข้าใจว่า Window Function ทำอะไรได้บ้าง

เพื่อให้เฉพาะเจาะจงยิ่งขึ้น คำสั่ง Window โดยทั่วไปจะมีลักษณะดังนี้:

<window function> over (<window definition>)

Window Function อาจเป็น Aggregation Window Function หรือ Built-in Window Function ก็ได้ นี่คือรายการของ Aggregation Functions ที่คุณสามารถใช้ได้ คุณน่าจะมีความคุ้นเคยกับสิ่งเหล่านี้อยู่บ้างแล้ว

ใน Part ต่อไปเป็นการเพิ่มคำสั่ง Over เข้าไป หากไม่มีคำสั่ง Over ก็แสดงว่าไม่ใช่ Window Function

คำสั่ง Over นำหน้า Window Definition ในกรณีนี้เราจะใช้ Partition By แต่คุณก็อย่าเพิ่งกังวลเกี่ยวกับ Window Definitions อื่น ๆ ไป ณ ตอนนี้ มี 2 สิ่งที่พบมากที่สุดก็คือ Partition By และ Order By และนั่นคือทั้งหมดที่จะกล่าวถึงในบทความนี้ ตอนนี้คุณอาจจะพอเดาได้แล้วว่า Partition By เป็นตัวกำหนด Level ของ Aggregation ในกรณีนี้ เรากำลังบอก Query ว่า เราต้องการ Weight สูงสุดตาม City

2. Window Function ที่เรียบง่ายที่สุด

เมื่อเราได้ผ่าน Window Function แรกมาแล้ว เรามาดูตัวอย่างที่ 2 กัน ซึ่งมันค่อนข้างง่าย

เมื่อคุณไม่ได้ใส่ Window Definition แสดงว่าคุณกำลังรวมผลรวมของทั้ง Table สิ่งนี้มีประโยชน์อย่างมากในสถานการณ์พิเศษบางอย่าง ดังนั้น เราจะแสดงสิ่งนี้อย่างรวดเร็วเพื่อช่วยให้คุณนึกถึงงานของคุณได้ในภายหลัง

นี่คือ Query ในรูปแบบเดียวกันกับด้านบน โดยที่ไม่มี Window Function

3. แนะนำ Window Definition: ORDER BY

ตอนนี้เราได้กล่าวถึงพื้นฐานของ Window Functions ไปแล้ว ต่อไปเราจะแนะนำ Window Definition ตัวต่อมาก็คือ ORDER BY ซึ่งอันที่จริงชื่อของมันก็บอกเป็นนัย ๆ อยู่แล้ว นั่นคือมันเป็นการเรียงลำดับข้อมูลของคุณใน Rows ของ Table ของคุณตาม Column ที่คุณเลือก

ในตัวอย่างข้างต้น Window Function นี้กำลังคำนวณยอดรวมของจำนวน Admissions ตาม Date ในกรณีนี้ขอไม่แสดงตัวอย่างอื่นที่ให้ผลลัพธ์ในแบบเดียวกัน เพราะเชื่อว่าคุณอาจไม่สามารถทำได้โดยไม่ต้องใช้ Window Function นี่คือเหตุผลที่กล่าวถึงในตอนต้นของบทความว่า Window Functions จะช่วยพัฒนาทักษะการจัดการข้อมูล (Data Manipulation) ของคุณใน SQL ไปสู่ระดับที่สูงขึ้น

4. Window Function: ROW_NUMBER

สำหรับตัวอย่างที่ 4 นี้ เรากำลังรวบรวมสิ่งที่คุณได้เรียนรู้มาบ้างแล้วกับ Window Function ที่เพิ่มเข้ามาซึ่งก็คือ Row Number ซึ่ง ณ จุดนี้ เราได้รวม Aggregate Window Functions สำหรับ Function แรก เนื่องจากมันเป็น Window Function ที่ค่อนข้างง่ายที่สุดตัวหนึ่ง และขณะเดียวกันก็ยังมี Built-in Window Functions ที่พร้อมใช้งานด้วย

Concept ใหม่ที่เพิ่มเติม สำหรับในตัวอย่างนี้ก็คือ row_number() Function ที่อยู่ในช่วงต้นของ Window Function ซึ่งสิ่งนี้จะกำหนด number ที่ต่อเนื่องตาม Window Definition ในกรณีนี้ Definition ของเราก็คือ เราต้องการแบ่งตาม City และเรียงลำดับตาม Birth Date ในลำดับที่เรียงจากหลังไปหน้า (สูงไปหาต่ำ)

หากคุณยังไม่แน่ใจว่าจะแสดงผลลัพธ์ออกมาอย่างไร นี่คือ Link สำหรับ Website ที่เอาไว้ฝึกฝน SQL ตามที่บอกไว้ในตอนต้น (https://www.sql-practice.com/)  เพียงคุณพิมพ์ SQL Code ใน Website นั้นโดยลบคำสั่ง WHERE ออก เพื่อทำความเข้าใจว่า เกิดอะไรขึ้น

คำถามที่ Query นี้มีคำตอบก็คือ "ใครคือ Patients ที่มีอายุน้อยที่สุดเป็นลำดับที่ 2 ในแต่ละ City" คุณอาจสามารถเขียน Query ที่ให้ผลลัพธ์เหมือนกันเพื่อค้นหา Patients ที่อายุน้อยที่สุดในแต่ละ City ได้อย่างง่ายดาย แต่คำถามคือ แล้วคนที่อายุน้อยเป็นลำดับที่ 2 หรือที่ 3 ล่ะ? Window Functions จะช่วยทำให้คำถามบางข้อที่ยาก สามารถเขียน Code และได้คำตอบที่ง่ายขึ้นมาก

5. Window Functions: LAG และ LEAD

Window Function นี้จะช่วยตอบคำถามต่อไปนี้คือ "ส่วนสูง (Height) ของผู้ป่วย (Patient) แต่ละราย มีความแตกต่างอย่างไรเมื่อเทียบกับ Patient ที่สูงที่สุดในลำดับถัดไป"

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

คำสั่ง Lag จะนำค่าของ Row ก่อนหน้ามาใส่ใน Row ปัจจุบัน โดยที่ Lag ที่ถูก Default ไว้ก็คือ 1 Row แต่คุณสามารถระบุ Parameter นั้นได้ทันทีหลังจากเลือก Column ใน Lag Function

ส่วนคำสั่ง Lead ก็คล้ายคลึงกับ Lag แต่มันทำงานตรงกันข้ามกัน โดยใช้ Row ที่อยู่ถัดไป และจะใส่ค่าอยู่ใน Row ปัจจุบันเพื่อการเปรียบเทียบ

สรุป

นี่คือภาพรวมทั่วไปของ Window Functions และหวังว่าคุณสามารถนำสิ่งเหล่านี้ไปใช้ประโยชน์ ซึ่งจะช่วยทำให้ทักษะ SQL ของคุณก้าวหน้าขึ้นไปอีกระดับ และหากคุณต้องการทราบรายละเอียดเพิ่มเติมเกี่ยวกับ Window Functions สามารถอ่านเพิ่มเติมได้ที่ SQLite Window Function Documentation

ที่มา:  https://towardsdatascience.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด