ในโลกของการเจรจาต่อรอง (Negotiation) การค้นหา พื้นที่ที่จะตกลงกันได้ (ZOPA – Zone of Possible Agreement) ถือเป็นหัวใจสำคัญของความสำเร็จ ZOPA คือขอบเขตของเงื่อนไขหรือมูลค่าที่ทุกฝ่ายที่เกี่ยวข้องสามารถยอมรับร่วมกันได้ การหา ZOPA ไม่ใช่แค่การประนีประนอม แต่คือการค้นหามูลค่าร่วม (Shared Value) ที่ทำให้ข้อตกลงนั้นแข็งแกร่งและยั่งยืน
ในมุมมองของ System Architect และ Data Specialist เราสามารถแปลแนวคิด ZOPA ให้กลายเป็นกระบวนการทางคณิตศาสตร์และฐานข้อมูลที่เรียกว่า การหาค่าส่วนตัด (Intersection) หรือ การหาช่วงที่ทับซ้อนกัน (Overlap) ในชุดข้อมูล ซึ่งเป็นหัวใจหลักของการวิเคราะห์ข้อมูลเพื่อหาข้อสรุปที่ทุกฝ่ายยอมรับได้
ZOPA ในเชิงเทคนิค: การหาพื้นที่ทับซ้อนด้วย PostgreSQL
เมื่อเรานำ ZOPA มาประยุกต์ใช้กับฐานข้อมูล PostgreSQL เรากำลังมองหาช่วงข้อมูล (Range) ที่อยู่ในขอบเขตของเงื่อนไขหลายชุดพร้อมกัน ตัวอย่างเช่น หากฝ่าย A กำหนดช่วงราคาที่ยอมรับได้ (Min-Max) และฝ่าย B ก็กำหนดช่วงราคาที่ยอมรับได้ การหา ZOPA ก็คือการหาช่วงราคาที่ทั้งสองฝ่ายยอมรับพร้อมกัน ซึ่ง PostgreSQL มีความสามารถที่ทรงพลังในการจัดการข้อมูลช่วง (Range Data Types) และการดำเนินการเชิงตรรกะที่ซับซ้อน
หลักการทำงานของ Range Intersection
ใน PostgreSQL เราสามารถใช้ฟังก์ชันและตัวดำเนินการที่เกี่ยวข้องกับช่วงข้อมูล (Range) เพื่อหาพื้นที่ทับซ้อนได้อย่างแม่นยำ โดยเฉพาะการใช้ตัวดำเนินการ `&&` (Overlap) หรือการใช้ฟังก์ชันที่คำนวณค่าส่วนตัด (Intersection) จากช่วงข้อมูลที่กำหนด
สมมติว่าเรามีตารางที่เก็บขอบเขตเงื่อนไขของสองฝ่าย (Party A และ Party B) และเราต้องการหาว่าช่วงราคาที่ทั้งสองฝ่ายยอมรับร่วมกันคือช่วงใด:
SQL
-- 1. สร้างตารางจำลองสำหรับเก็บช่วงราคาที่ยอมรับได้ (ZOPA Candidates) ใช้วิธีการกำหนดช่วงข้อมูล (Range) ใน PostgreSQL
CREATE TABLE negotiation_ranges (
party_name TEXT,
min_value NUMERIC,
max_value NUMERIC
);
-- 2. ใส่ข้อมูลจำลอง: Party A ยอมรับ [10 ถึง 50], Party B ยอมรับ [30 ถึง 70]
INSERT INTO negotiation_ranges (party_name, min_value, max_value) VALUES
('Party A', 10, 50),
('Party B', 30, 70);
-- 3. คำสั่ง SQL เพื่อหา ZOPA (Intersection) โดยการหาช่วงที่ทับซ้อนกัน (Overlap)
-- เราจะหาค่า Min ที่มากที่สุด และ Max ที่น้อยที่สุดจากทุกช่วงที่ทับซ้อนกัน
WITH ranges_a AS (
SELECT (min_value, max_value)::interval AS range_a FROM negotiation_ranges WHERE party_name = 'Party A'
),
ranges_b AS (
SELECT (min_value, max_value)::interval AS range_b FROM negotiation_ranges WHERE party_name = 'Party B'
)
SELECT
-- ZOPA Min คือค่า Max ของ Min ทั้งหมด
GREATEST(ra.min_value, rb.min_value) AS zopa_min,
-- ZOPA Max คือค่า MIN ของ Max ทั้งหมด
LEAST(ra.max_value, rb.max_value) AS zopa_max,
-- ตรวจสอบว่า ZOPA มีอยู่จริงหรือไม่ (Min ต้องไม่เกิน Max)
CASE WHEN GREATEST(ra.min_value, rb.min_value) <= LEAST(ra.max_value, rb.max_value) THEN 'YES' ELSE 'NO' END AS is_possible
FROM
ranges_a ra, ranges_b rb;
-- ผลลัพธ์ที่ได้คือ: zopa_min = 30, zopa_max = 50, is_possible = YES
-- ซึ่งหมายถึง ZOPA คือช่วง [30, 50]
บทสรุป: การใช้ Data Logic ในการตัดสินใจทางธุรกิจ
การใช้ PostgreSQL ในการหา ZOPA ไม่ได้เป็นเพียงการเขียนโค้ด แต่คือการแปลงหลักการทางทฤษฎีการเจรจาต่อรองที่ซับซ้อนให้เป็นกระบวนการคำนวณที่แม่นยำและอัตโนมัติ การใช้ Range Data Types และฟังก์ชันทางคณิตศาสตร์อย่าง `GREATEST` และ `LEAST` ช่วยให้เราสามารถระบุขอบเขตที่ทุกฝ่ายยอมรับได้ (The Overlap) ได้อย่างชัดเจน ทำให้การตัดสินใจทางธุรกิจมีความเป็นระบบและมีหลักฐานข้อมูลรองรับอย่างสมบูรณ์