2016-02-22 2 views
0

Первый пост здесь, и я сделал кучу поисков, чтобы найти это, но не знаю терминологию для поиска для начала. У меня есть таблица в SQL Server 2012, содержащих данные расписаний с этими столбцами: Name, ID, ENTEREDONDTM, EVENTDATE, STARTDTM, ENDDTM, STARTREASON, ENDREASONsql row_number остается неизменным, если не соблюдены критерии.

Я пытаюсь сделать row_number где значение в row_number остается тем же, если StartReason = 'newShift' в этом случае я не хотел бы, чтобы его увеличить на 1 .

Моя конечная цель, чтобы найти общую длину сдвига в смену, и я знаю, как сделать эти расчеты, основанные на startdtm и enddtm, но нет тока колонков с shiftID для меня группу.

+0

не ясно для меня достаточно ... есть вторая запись с конечным временем для этого же сдвига? или все это на этой же записи? – Randy

+0

Вот немного больше информации (я не знаю, как разместить таблицу данных примеров здесь). startdtm будет, когда они начнут синхронизировать, и enddtm, когда они выходят из строя, начинают рассуждать, почему они синхронизированы. Таким образом, у них может быть запись, которая является startdtm = 8am (в формате даты и времени) и enddtm = 12pm и startreason = newShift Следующая строка будет startdtm = 12:30 pm и enddtm = 4pm и startreason = 30minbreak. Следующая строка обычно будет следующей сменой, и мы знаем только, что на основе startreason = newShift. Endreason всегда выходит, поэтому он не помогает. –

ответ

0

Вы можете использовать оконную функцию Rank(), разбитую на StartReason и добавить +1 (чтобы зарезервировать первую). Прежде чем использовать это значение, вы можете использовать случай для сравнения значения.

Exemple: case StartReason when 'newShift' then 1 else Rank() over (Partition by StartReason) +1

+0

Я не хочу, чтобы newShift всегда был 1. Я хочу, чтобы это было 1, только когда это первый newShift, тогда я хочу, чтобы каждая последующая строка была 1 до появления другого newShift. Затем я хочу, чтобы второй newShift был 2 и каждая строка между этим и следующим newShift равнялась 2. –

+0

Я смог настроить то, что вы предоставили, в основном, что я хотел. Имена сдвига немного странны, потому что они являются номером строки для этого конкретного сотрудника, а не обязательно следующей shiftID, но поскольку я группирую их, и они не имеют значения, иначе я просто проигнорирую это. –

+0

; с GroupByEmployees AS ( SELECT, ID, [STARTDTM], [ENDDTM], [STARTREASON], [ENDREASON], ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY гипсе ([StartDTM] КАК DateTime)) А.С. EmpPunchNum ОТ [DBO]. [BigLots_Perez_20160208_Punch] ) , FindShiftID А.С. ( SELECT *, случай StartReason, когда 'newShift', то место() в течение (раздел по приказу идентификатора по ID, EmpPunchNum) еще 0 концов, как ShiftID ОТ GroupByEmployees ) SELECT *, СЛУЧАЙ ShiftID, когда '0', то LAG (ShiftID, 1) OVER (Partition по ID Поручения ID, emppunchnum) еще ShiftID конец, как FinalShiftID FROM FindShiftID заказать по id, EmpPunchNum –

Смежные вопросы