Как найти людей, которые отсутствуют непрерывно для n количества дней?

У меня была такая же проблема после обновления до Xcode 10.2. После выполнения описанных ниже шагов это сработало для меня:

  1. Обновить модули
  2. Очистить папку проекта
  3. Изменить версию проекта Swift Language на [ 116] Не указано и (в соответствии с предложением @Neil Faulkner) Режим компиляции - Инкрементный
5
задан Mihai Limbășan 22 March 2009 в 22:01
поделиться

4 ответа

Необходимо смочь сделать это с CTE в SQL 2005. Кража данные Lievens:

DECLARE @Attendance TABLE (EmployeeNumber INTEGER, EntryDate DATETIME, Status VARCHAR(1))

INSERT INTO @Attendance VALUES (200, '03/01/2009', 'P')
INSERT INTO @Attendance VALUES (200, '03/02/2009', 'A')
INSERT INTO @Attendance VALUES (200, '03/03/2009', 'A')
INSERT INTO @Attendance VALUES (200, '03/04/2009', 'A')
INSERT INTO @Attendance VALUES (200, '04/04/2009', 'A')
INSERT INTO @Attendance VALUES (200, '04/05/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/01/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/02/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/03/2009', 'P');

Затем используйте этот CTE для извлечения последовательности:


 WITH Dates 
    (
        EntryDate,
        EmployeeNumber,
        Status,
        Days
    ) 
    AS
    (
        SELECT
            a.EntryDate,
            a.EmployeeNumber,
            a.Status,
            1
        FROM
            @Attendance a

        WHERE
            a.EntryDate = (SELECT MIN(EntryDate) FROM @Attendance)


        -- RECURSIVE    
        UNION ALL

        SELECT
            a.EntryDate, 
            a.EmployeeNumber,
            a.Status,
            CASE WHEN (a.Status = Parent.Status) THEN Parent.Days + 1 ELSE 1 END
        FROM
            @Attendance a
        INNER JOIN
            Dates parent
        ON
            datediff(day, a.EntryDate, DateAdd(day, 1, parent.EntryDate)) = 0
        AND
            a.EmployeeNumber = parent.EmployeeNumber
    )

    SELECT * FROM Dates order by EmployeeNumber, EntryDate

Хотя как финал отмечают, что последовательность действительно кажется странной для меня, в зависимости от Ваших требований может быть лучший способ агрегировать данные? Однако, это произведет последовательность, которой Вы требуете

1
ответ дан 14 December 2019 в 19:26
поделиться

я не уверен, что следую за тем, что Вы желаете с 1 1 2 1 1 последовательность, но просто добавляете, что порядок к Вашему исходному запросу производит ту последовательность...

SELECT  EmployeeNumber, 
        EntryDate,
        Status,
        ROW_NUMBER() OVER (PARTITION BY EmployeeNumber, Status ORDER BY EmployeeNumber, EntryDate) AS 'RowNumber'    
FROM    Attendance
ORDER BY EmployeeNumber, EntryDate


/*
EmployeeNumber EntryDate               Status RowNumber
-------------- ----------------------- ------ --------------------
200            2009-03-01 00:00:00     P      1
200            2009-03-02 00:00:00     A      1
200            2009-03-03 00:00:00     A      2
201            2009-03-01 00:00:00     A      1
201            2009-03-02 00:00:00     P      1

(5 row(s) affected)
*/
3
ответ дан 14 December 2019 в 19:26
поделиться

Вы могли использовать рекурсию, подобную тому, что я сделал здесь. Это кажется, хотя та Ваша проблема немного более проста, и так как SQL Server ограничивает рекурсию 99, это не могло бы работать на людей, которые отсутствуют много. Позвольте мне думать об этом несколько минут.

Если Вы ссоритесь в течение каждого дня, пойдите с соединением Lieven.

0
ответ дан 14 December 2019 в 19:26
поделиться

Это помогает Вам?
Это не производит последовательность, которую Вы спрашиваете (Никакая идея, как сделать это), но это действительно дает Вам сумму дней подряд, кто-то отсутствовал.

DECLARE @Attendance TABLE (EmployeeNumber INTEGER, EntryDate DATETIME, Status VARCHAR(1))

INSERT INTO @Attendance VALUES (200, '03/01/2009', 'P')
INSERT INTO @Attendance VALUES (200, '03/02/2009', 'A')
INSERT INTO @Attendance VALUES (200, '03/03/2009', 'A')
INSERT INTO @Attendance VALUES (200, '03/04/2009', 'A')
INSERT INTO @Attendance VALUES (200, '04/04/2009', 'A')
INSERT INTO @Attendance VALUES (200, '04/05/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/01/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/02/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/03/2009', 'P')


SELECT a1.EmployeeNumber, [Absent] = COUNT(*) + 1
FROM @Attendance a1
     INNER JOIN @Attendance a2 ON a1.EntryDate = a2.EntryDate - 1 
                                  AND a1.EmployeeNumber = a2.EmployeeNumber
                                  AND a1.Status = a2.Status
GROUP BY a1.EmployeeNumber
1
ответ дан 14 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: