Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

หาวันที่แรกจาก Timestamp กลุ่มตามคอลัมน์ที่ซ้ำใน MySQL

การเตรียมข้อมูล

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 หรือ TIMESTAMP Type แทน VARCHAR