You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access查询:按权限状态将日期分组为起止日期范围

权限状态连续日期分组查询需求

原权限表结构及数据

IDUserIDDatePermission
113702022/10/24Approved
213702022/10/31Rejected
313702022/11/07Approved
413702022/11/14Approved
513702022/11/21Rejected
613702022/11/28Rejected
713702022/12/05Rejected
813702022/12/12Approved
913702022/12/19Approved
1013702022/12/26Approved
1113702023/01/02Rejected
1224562022/12/26Rejected
1324562023/01/02Rejected
1424562023/01/09Approved
1524562023/01/16Approved

查询需求

编写SELECT查询,将同一UserID下Permission状态相同的连续日期分组为Date From(起始日期)和Date Till(结束日期)范围,期望结果如下:

UserIDDate FromDate TillPermission
13702022/10/242022/10/24Approved
13702022/10/312022/10/31Rejected
13702022/11/072022/11/14Approved
13702022/11/212022/12/05Rejected
13702022/12/122022/12/26Approved
13702023/01/022023/01/02Rejected
24562022/12/262023/01/02Rejected
24562023/01/092023/01/16Approved

补充说明:上述是UserID为1370和2456的部分数据,用户提交权限申请后由系统进行Approved(审批通过)或Rejected(拒绝)操作,每日权限状态可能变动;为避免单独列出全年365天的数据,希望将连续同状态的日期合并为起止日期范围。

解决方案SQL

假设表名为Permissions,可以使用窗口函数实现连续相同状态的分组:

WITH RankedPermissions AS (
    SELECT
        UserID,
        Date,
        Permission,
        ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY Date) 
        - ROW_NUMBER() OVER (PARTITION BY UserID, Permission ORDER BY Date) AS GroupID
    FROM Permissions
)
SELECT
    UserID,
    MIN(Date) AS [Date From],
    MAX(Date) AS [Date Till],
    Permission
FROM RankedPermissions
GROUP BY UserID, Permission, GroupID
ORDER BY UserID, [Date From];

原理说明

  • 第一个ROW_NUMBER()按用户ID和日期排序,生成全局行号;
  • 第二个ROW_NUMBER()按用户ID、权限状态和日期排序,生成同状态下的行号;
  • 两者的差值GroupID会将连续相同权限状态的记录归为同一组;
  • 最后按用户ID、权限和GroupID分组,取每组的最小和最大日期作为起止范围。

内容的提问来源于stack exchange,提问作者Arya Basiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:45:33