表結構包含 org(組織)、status、date 等字段。需求:按月份分組,查詢每個組織每月第一條記錄(按日期排序)。
適用於 MySQL 8.0+、PostgreSQL、SQL Server、Oracle:
WITH Ranked AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY org, YEAR(date), MONTH(date)
ORDER BY date ASC
) AS rn
FROM your_table
)
SELECT * FROM Ranked WHERE rn = 1;
SELECT t1.*
FROM your_table t1
JOIN (
SELECT org, YEAR(date) AS yr, MONTH(date) AS mn, MIN(date) AS first_date
FROM your_table
GROUP BY org, YEAR(date), MONTH(date)
) t2
ON t1.org = t2.org
AND YEAR(t1.date) = t2.yr
AND MONTH(t1.date) = t2.mn
AND t1.date = t2.first_date;
若同月同組織有多條相同最早日期,會返回多行。可再加唯一鍵去重。
SELECT TOP 1 WITH TIES *
FROM your_table
ORDER BY ROW_NUMBER() OVER (PARTITION BY org, YEAR(date), MONTH(date) ORDER BY date);
(org, date) 建立聯合索引。YEAR(date)),改用範圍查詢:date >= '2023-01-01' AND date < '2023-02-01'。現代數據庫首選 ROW_NUMBER() 窗口函數,語義清晰且性能優;舊版本用分組最小日期自連接。根據具體數據庫版本選擇語法。