Heim  >  Fragen und Antworten  >  Hauptteil

Erhalten Sie Mitarbeiter, die sich an 11 aufeinanderfolgenden Tagen nicht angemeldet haben

<p>Ich versuche, Mitarbeiter aus der Datenbank zu ermitteln, die an 11 aufeinanderfolgenden Tagen keine Anwesenheitsliste angezeigt haben. Dafür habe ich eine Mitarbeitertabelle und eine Anwesenheitstabelle, aber das Problem dabei ist, dass es keinen Datensatz in der Anwesenheitstabelle gibt. Wie kann ich also </p> <p>Ich habe viele Abfragen ausprobiert, einige davon lauten wie folgt: </p> <pre class="brush:php;toolbar:false;">SELECT e.name, e.full_name VON tabMitarbeiter e LINKS BEITRETEN ( WÄHLEN Angestellter, Angestellter MIN(Anwesenheitsdatum) AS erstes_Anwesenheitsdatum VON tabAnwesenheit GROUP BY-Mitarbeiter ) ar ON e.name = ar.employee WO ar.first_attendance_date NULL IST ODER EXISTIERT NICHT ( WÄHLEN 1 VON tabAnwesenheit WO Mitarbeiter = e.name AND attendance_date >= ar.first_attendance_date AND attendance_date < DATE_ADD(ar.first_attendance_date, INTERVAL 11 DAY) )</pre> <p>Eine weitere Abfrage:</p> <pre class="brush:php;toolbar:false;">SELECT e.name, COUNT(a.`attendance_date`), COUNT(e.`name`) from tabEmployee e LEFT JOIN tabAttendance a ON e.name = a.`employee` WO a.`employee` NULL IST GROUP BY e.`name`</pre> <p><br /></p>
P粉103739566P粉103739566428 Tage vor459

Antworte allen(1)Ich werde antworten

  • P粉231079976

    P粉2310799762023-08-19 07:58:16

    使用 LAG() 分析函数,我们可以尝试:

    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 中生成出勤日期的 lag(前一个连续值)。然后我们只报告有 11 天或更长间隔的员工。

    Antwort
    0
  • StornierenAntwort