我有要求,我将需要获得一个员工的作用天数.

Scenario 1

   EmployeeId    role   effectiveFrom
      1           A      1-Jan-2021
      1           B      15-Jan-2021

对于角色A,1月份没有其他角色可用,因此角色A的天数将为14天.

Scenario 2

   EmployeeId    role   effectiveFrom
      1           A      1-Jan-2021

1月份没有更多的角色可用,因此角色A的天数将是31天,即整个1月份.对于2月份,我预计会得到28个,因为这个角色也将在整个2月份有效.

Scenario 3

   EmployeeId    role   effectiveFrom
      1           A      1-Jan-2021
      1           B      15-Jan-2021
      1           A      25-Jan-2021

要获取角色A的天数,逻辑为

  • 1号到15号是14天.
  • 25日到31日(1月31日)是6天.
  • 14+6=20天

到目前为止,我提出的查询是这样的,

SELECT 
    DATEDIFF(MAX(effectiveFrom),
            IF(MIN(effectiveFrom) = MAX(effectiveFrom),
                MIN(effectiveFrom),
                MIN(effectiveFrom))) + 1 daysWorked
FROM
    EmployeeRoles
WHERE grade = 'A'  
GROUP BY `employeeId`,effectiveFrom;

这只能给出场景1的结果1天.有人能指导我处理场景的实际方法吗?我已经研究了循环和窗口函数,但我对继续进行的最佳方法一无所知.

dbfiddle

推荐答案

当场景2从1月1日到月底有31天时,我怀疑从1月25日到月底是7天,而不是您在场景3中写的6天.

天数,使用上面的计算:

SELECT
   employeeID,
   grade,
   effectiveFrom,
   DATEDIFF(COALESCE(LEAD(effectiveFrom) 
                             OVER (PARTITION BY employeeID ORDER By effectiveFrom),
                     DATE_ADD(LAST_DAY(effectiveFrom),INTERVAL 1 DAY)),
            effectiveFrom) as '#Days'
FROM EmployeeRole;

这可以归类,并归结为:

SELECT
   employeeID,
   grade,
   SUM(`#Days`)
FROM (

SELECT
   employeeID,
   grade,
   effectiveFrom,
   DATEDIFF(COALESCE(LEAD(effectiveFrom) 
                            OVER (PARTITION BY employeeID ORDER By effectiveFrom),
                     DATE_ADD(LAST_DAY(effectiveFrom),INTERVAL 1 DAY)),
            effectiveFrom) as '#Days'
FROM EmployeeRole
) x
GROUP BY
  employeeID,
   grade;

输出:

employeeID grade SUM(#Days)
1 A 14
1 B 17
2 A 31
3 A 21
3 B 10

请参阅:DBFIDDLE

Mysql相关问答推荐

括号在SQL查询中的作用?

如何在JOIN中获取MySQL中的项目总数

如何合并有多行的json列

提高bash脚本从大型gml文件读取数据的效率

错误:此查询集包含对外部查询的引用,并且只能在子查询中使用

使用Workbench时如何添加mysqldump配置标志

SQL - 基本的内部连接查询

根据 Power Query 中的条件替换值

MYSQL REGEXP_REPLACE 在数字之后

从 SQL 中的左连接和内连接中减go 计数

在 MySQL 中 Select COUNT of MAX

如何在 Mysql 中创建复合外键

SQL UPDATE中的str_replace?

MySQL - 使一对值唯一

MySQL SELECT 增量计数器

Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

什么是全文索引,我应该什么时候使用它?

在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?

如何通过一个语句描述数据库中的所有表?