การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1870 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value INT,
ShippingTimestamp VARCHAR(100) -- Unix Timestamp
);
mysql> INSERT INTO DemoTable1870(Value, ShippingTimestamp) VALUES
(10, '1570645800'), (10, '1546194600'),
(11, '1573324200'), (11, '1557599400');
ข้อมูลในตาราง
+----+-------+-------------------+
| Id | Value | ShippingTimestamp |
+----+-------+-------------------+
| 1 | 10 | 1570645800 |
| 2 | 10 | 1546194600 | -- เก่ากว่า (2018-12-31)
| 3 | 11 | 1573324200 |
| 4 | 11 | 1557599400 | -- เก่ากว่า (2019-05-11)
+----+-------+-------------------+
หา Timestamp ต่ำสุด (เก่าสุด) แต่ละ Value
mysql> SELECT MIN(ShippingTimestamp) FROM DemoTable1870 GROUP BY Value;
ผลลัพธ์:
+------------------------+
| min(ShippingTimestamp) |
+------------------------+
| 1546194600 | -- Value 10
| 1557599400 | -- Value 11
+------------------------+
แปลง Unix Timestamp เป็นวันที่อ่านได้
SELECT
Value,
FROM_UNIXTIME(MIN(ShippingTimestamp)) AS FirstDate
FROM DemoTable1870
GROUP BY Value;
ผลลัพธ์:
+-------+---------------------+
| Value | FirstDate |
+-------+---------------------+
| 10 | 2018-12-31 00:30:00 |
| 11 | 2019-05-11 00:30:00 |
+-------+---------------------+
ขยาย: ดูรายละเอียดแถวที่มีวันที่เก่าสุด
-- MySQL 8.0+ Window Function
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY ShippingTimestamp) AS rn
FROM DemoTable1870
) t WHERE rn = 1;
-- Correlated Subquery (รองรับทุก Version)
SELECT t1.* FROM DemoTable1870 t1
WHERE t1.ShippingTimestamp = (
SELECT MIN(ShippingTimestamp) FROM DemoTable1870 t2 WHERE t2.Value = t1.Value
);
ข้อสังเกต
- ShippingTimestamp เป็น VARCHAR แต่เก็บตัวเลข Unix Timestamp
- MIN() ทำงานได้เพราะ String Comparison ของตัวเลข = Numeric Comparison (ความยาวเท่ากัน)
- แนะนำใช้
BIGINTหรือTIMESTAMPType แทน VARCHAR