首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 查詢:按月份獲取每個組織每月第一條記錄

     編輯:程式設計綜合問答

問題描述

表結構包含 org(組織)、status、date 等字段。需求:按月份分組,查詢每個組織每月第一條記錄(按日期排序)。

通用解法:窗口函數 (ROW_NUMBER)

適用於 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;

MySQL 5.7 / 老版本兼容寫法

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;

若同月同組織有多條相同最早日期,會返回多行。可再加唯一鍵去重。

SQL Server 特有 TOP 1 WITH TIES 寫法

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) 建立聯合索引。
  • 避免在 WHERE 中對日期列使用函數(如 YEAR(date)),改用範圍查詢:date >= '2023-01-01' AND date < '2023-02-01'。

總結

現代數據庫首選 ROW_NUMBER() 窗口函數,語義清晰且性能優;舊版本用分組最小日期自連接。根據具體數據庫版本選擇語法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved