我正在试着从数据库中找到连续11天没有标记考勤的员工 为此,我有员工表和考勤表,但我面临的问题是我在考勤表中没有记录,所以我如何才能获得它

我try 了很多查询,其中一些是

SELECT e.name, e.full_name
FROM tabEmployee e
LEFT JOIN (
    SELECT 
        employee,
        MIN(attendance_date) AS first_attendance_date
    FROM tabAttendance
    GROUP BY employee
) ar ON e.name = ar.employee
WHERE ar.first_attendance_date IS NULL OR 
      NOT EXISTS (
          SELECT 1
          FROM tabAttendance
          WHERE employee = e.name
          AND attendance_date >= ar.first_attendance_date
          AND attendance_date < DATE_ADD(ar.first_attendance_date, INTERVAL 11 DAY)
      )

另一个查询

SELECT e.name, COUNT(a.`attendance_date`), COUNT(e.`name`) from tabEmployee e
LEFT JOIN tabAttendance a ON e.name = a.`employee`
WHERE a.`employee` IS NULL
GROUP BY e.`name`

推荐答案

使用LAG()解析函数,我们可以try :

WITH cte AS (
    SELECT e.name, e.full_name,
           LAG(a.attendance_date) OVER (PARTITION BY a.employee
                                        ORDER BY a.attendance_date) AS lag_attendance_date
    FROM tabAttendance a
    INNER JOIN tabEmployee e ON e.name = a.employee
)

SELECT DISTINCT name, full_name
FROM cte
WHERE DATEDIFF(attendance_date, lag_attendance_date) > 11;

这里的基本策略是在CTE中生成出勤日期的滞后(先前的顺序值).然后,我们只报告间隔11天或更长时间的员工.

Mysql相关问答推荐

为什么我安装MySQL时不能使用3306端口?

MySQL有没有办法直接从CSV文件中读取而不是导入它?

了解MySQL_stmt_BIND_NAMED_Param()-MySQL C API

MySQL Group by或Distinct in Window函数

如何用sql找出两次之间的差异

列出每年最多产的三位作家

关联同一个表中的两列

为什么 MySQL 不使用索引进行简单的SELECT * FROM Table WHERE field='value'查询?

如何将结果列中的不同值按其他列sql中的值带入单行

如何创建一个判断行是否存在的mysql查询-如果存在我想插入一条新记录,否则增加一个值

用两个新列制作表格,按偶数或奇数对另一列进行分类,并将一个类别中的所有偶数和奇数相加

计算每个用户在第二个表中有多少条记录

If else on WHERE 子句

在 MySQL 的存储过程中调用存储过程

Laravel classloader.php 错误打开流失败:没有这样的文件或目录

mysql 数据类型仅存储月份和年份

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

MySQL在哪里存储数据库文件?

在 PHP 中运行 MySQL *.sql 文件

我在哪里可以下载 mysql jdbc jar?