วิธีการดึงข้อมูล ราคาล่าสุด
จาก SQL Server Table อย่างมีประสิทธิภาพ
ในด้านการจัดการฐานข้อมูล ความท้าทายที่พบบ่อยสำหรับนักพัฒนาหลายคนคือการดึงข้อมูลราคาล่าสุดสำหรับผลิตภัณฑ์หรือรายการต่างๆ จากตารางที่เก็บข้อมูลประวัติจำนวนมาก หากคุณใช้ SQL Server โดยเฉพาะเวอร์ชัน 2005 การดึงข้อมูลราคาล่าสุดจากตารางที่มีการปรับปรุงราคาอย่างมากมายอาจเป็นเรื่องที่น่ากังวล โดยเฉพาะเมื่อชุดข้อมูลมีขนาดใหญ่ ในโพสต์บล็อกนี้ เราจะพิจารณาปัญหานี้อย่างตรงไปตรงมาโดยแสดงให้คุณเห็นว่าจะแปรง SQL Query อย่างมีประสิทธิภาพเพื่อให้ได้ราคาล่าสุดที่ไม่ซ้ำกัน—เฉพาะสำหรับกลุ่มรายการ—โดยไม่มีการซ้ำซ้อนในชุดผลลัพธ์ของคุณ
การเข้าใจปัญหา
โครงสร้างของตารางของเรามีดังนี้:
ID uniqueidentifier NOT NULL,
ThingID int NOT NULL,
PriceDateTime datetime NOT NULL,
Price decimal(18,4) NOT NULL
คุณอาจมีบันทึกจำนวนมากสำหรับแต่ละ “สิ่ง” ในแต่ละวัน ซึ่งทำให้การกรองข้อมูลเพื่อค้นหาการปรับปรุงราคาล่าสุดเป็นเรื่องยุ่งยาก ตัวอย่างเช่น หากคุณรันคำถามแบบนี้:
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4,5,6)
AND PriceDate > cast( convert(varchar(20), getdate(), 106) as DateTime)
คำถามนี้จะส่งคืนบันทึกราคาทั้งหมดสำหรับ ThingID
ที่ระบุจากวันที่ปัจจุบัน แต่คุณอาจพบว่ามีแถวจำนวนมาก—มากกว่าที่คุณต้องการจริงๆ เป้าหมายชัดเจน: ดึงแค่ หนึ่ง รายการ (ราคาล่าสุด) สำหรับแต่ละ ThingID
จะทำได้อย่างไรในทางที่เหมาะสม?
วิธียุ่งยาก: การใช้ Subqueries
เพื่อที่จะดึงราคาล่าสุดของวันนี้โดยไม่ทำให้ผลลัพธ์ยุ่งเหยิง วิธีที่แนะนำคือการใช้ subquery นี่คือวิธีการที่คุณสามารถทำได้อย่างมีประสิทธิภาพ:
ตัวอย่าง SQL Query
SELECT *
FROM Thing
WHERE ID IN (SELECT MAX(ID)
FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
ในคำค้นนี้ เราใช้ GROUP BY ควบคู่กับ MAX(ID) เพื่อให้มั่นใจว่าคุณกำลังดึงข้อมูลการเข้าที่ล่าสุดสำหรับแต่ละ ThingID
สมมติว่าค่า ID ที่สูงกว่าจะหมายถึงราคาที่ใหม่กว่า ซึ่งเป็นแนวปฏิบัติที่ใช้ในรูปแบบฐานข้อมูลหลายประเภท
ปรับปรุงประสิทธิภาพด้วยคอลัมน์ IsCurrent
แม้ว่าคำค้นข้างต้นจะมีประสิทธิภาพ แต่สำหรับชุดข้อมูลขนาดใหญ่ แนะนำให้เพิ่มคอลัมน์ที่เรียกว่า IsCurrent
โดยคอลัมน์นี้จะแสดงวราคานั้นเป็นราคาล่าสุดหรือไม่ (1 หากใช่, 0 หากไม่ใช่) ต่อไปนี้เป็นวิธีการสร้างคำค้นที่เรียบง่ายโดยใช้วิธีนี้:
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
คำค้นที่เรียบง่ายนี้จะกรองราคาล่าสุดได้อย่างรวดเร็วโดยไม่ต้องใช้ subqueries อย่างไรก็ตาม เป็นสิ่งสำคัญมากที่จะต้องรักษาความสอดคล้องของข้อมูลเนื่องจากความเสี่ยงของข้อมูลที่ล้าสมัยหรือไม่ถูกต้องจะเพิ่มขึ้นเมื่อใช้สัญลักษณ์ IsCurrent
การจัดการกับ Unique Identifiers
ในกรณีที่ ID
เป็น uniqueidentifier (GUID) จะมีความซับซ้อนเพิ่มเติม นี่คือวิธีการปรับคำค้นของคุณ เพื่อรองรับโครงสร้างนั้น:
SELECT T.*
FROM Thing T
JOIN (SELECT ThingID, MAX(PriceDateTime) AS LatestPriceDate
FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID) X
ON X.ThingID = T.ThingID
AND X.LatestPriceDate = T.PriceDateTime
WHERE ThingID IN (1,2,3,4)
คำค้นที่ปรับปรุงนี้จะดึงราคาล่าสุดอย่างมีประสิทธิภาพโดยการ JOIN ตารางต้นฉบับกับ subquery ที่ระบุวันที่ราคาล่าสุดสำหรับแต่ละกลุ่ม ThingID
บทสรุป
การดึงราคาล่าสุดใน SQL Server จากตารางที่มีข้อมูลประวัติที่สำคัญต้องการการจัดโครงสร้างคำค้นอย่างรอบคอบเพื่อหลีกเลี่ยงปัญหาด้านประสิทธิภาพ โดยการใช้ subqueries และพิจารณาการใช้คอลัมน์ IsCurrent คุณสามารถบรรลุวิธีการจัดการข้อมูลราคาของคุณได้อย่างมีประสิทธิภาพและเป็นระเบียบมากขึ้น
ไม่ว่าคุณจะจำเป็นต้องดึงข้อมูลสำหรับสินค้าบางรายการหรือจัดการกับชุดข้อมูลที่กว้างขวาง คู่มือนี้จะช่วยให้คุณได้รับราคาล่าสุดโดยไม่ยุ่งยาก ขอให้สนุกกับการใช้คำค้น!