วันนี้บล็อกสั้น ๆ จากหัวข้อไม่งงกันใช่ไหม ^__^ อธิบายคร่าว ๆ คือกรณีเรามีตารางที่เก็บจำนวนสะสมไว้ในแต่ละวัน เวลาเราต้องการทราบว่าแล้ววันนี้มีเพิ่มเข้ามาใหม่เท่าไหร่ โดยทั่วไปทำมือก็อาจจะ
- นับจำนวนเฉพาะรายที่มาใหม่ไง
- หรือเอาจำนวนสะสมของวันนี้/ตอนนี้ ไปลบกับวันที่แล้ว
ใช่นั่นแหล่ะทำด้วยมือ แล้วในภาษา SQL เค้าทำยังไงกัน ให้เห็นภาพมากขึ้นเราจะเอาข้อมูลรายงานเคสโควิด 19 ของประเทศไทยในแต่ละวันมาเป็นข้อมูลดัมมี่หล่ะกัน (ข้อมูลจริงนะ นี่ ศบค. รายงานทุกวัน อยากได้ข้อมูลก็ไปที่กรมควบคุมโรค ที่นี่เลย https://covid19.ddc.moph.go.th/th/api)
*เราตัดเฉพาะยอดสะสมของแต่ละวันในเดือนพฤษภาคมหล่ะกัน เพื่อจะได้ง่ายขึ้น
CREATE TABLE `covid19timeline` (
`ConfirmedDate` date NOT NULL,
`Confirmed` int(11) NOT NULL,
`Recovered` int(11) NOT NULL,
`Hospitalized` int(11) NOT NULL,
`Deaths` int(11) NOT NULL,
PRIMARY KEY (`ConfirmedDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-01',2960,2719,187,54);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-02',2966,2732,180,54);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-03',2969,2739,176,54);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-04',2987,2740,193,54);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-05',2988,2747,187,54);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-06',2989,2761,173,55);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-07',2992,2772,165,55);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-08',3000,2784,161,55);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-09',3004,2787,161,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-10',3009,2794,159,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-11',3015,2796,163,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-12',3017,2798,163,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-13',3017,2844,117,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-14',3018,2850,112,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-15',3025,2854,115,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-16',3025,2855,114,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-17',3028,2856,116,56);
INSERT INTO `covid19timeline` (`ConfirmedDate`,`Confirmed`,`Recovered`,`Hospitalized`,`Deaths`) VALUES ('2020-05-18',3031,2857,118,56);
ข้อมูลก็ตามนี้

ทีนี้เราก็หาจำนวนรายใหม่กันว่ามีจำนวนเท่าไหร่โดยการเปรียบเทียบกับวันที่แล้ว
SELECT
c1.*,
COALESCE(c1.Confirmed - c2.Confirmed, 0) AS NewConfirmed
FROM covid19timeline c1
LEFT JOIN covid19timeline c2 ON c2.ConfirmedDate = DATE_SUB(c1.ConfirmedDate, INTERVAL 1 DAY)
ORDER BY c1.ConfirmedDate;
ผลลัพธ์ที่ได้ตามนี้ โดย NewConfirmed คือจำนวนรายใหม่ที่เพิ่มเข้ามา

จบปิ๊ง !! ^__^
ป.ล.
- แล้วเราจะเอามาใช้ตอนไหน โดยปกติส่วนใหญ่ก็มักอยู่ในรายงานที่ต้องการดูความเปลี่ยนแปลงเป็นหลักแต่ข้อมูลที่เรามีมักเป็นข้อมูลสะสมอย่างเดียว อย่างเคสการระบาดของโควิด 19 เป็นต้น (แต่ api เค้ามีแจ้งรายใหม่นะตัดออกเฉย ๆ)
- ไปลองเล่นกันได้ที่ https://www.db-fiddle.com/f/n3Zbf8FmThZxPGDgSGhmVN/0