Вы можете сделать это с помощью ROW_NUMBER()
дважды. Добавление следующие два столбца с вашими данными:
SELECT ID,
Department_ID,
mod_date,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY mod_date DESC),
RowNum2 = ROW_NUMBER() OVER(PARTITION BY ID, Department_ID ORDER BY mod_date)
FROM #T
WHERE mod_Date > '20151012';
дает
ID Department_ID mod_date RowNum RowNum2
--------------------------------------------------
A 55 2016-05-20 1 1
B 12 2015-12-24 2 1
B 55 2016-02-12 1 1
C 14 2016-08-03 2 1
C 55 2016-07-02 3 1
C 55 2016-10-05 1 2
Поскольку вы заинтересованы только в том, где в настоящее время отдел ИД 55, вам нужно фильтровать для RowNum = 1 AND Department_ID = 55
, который выходит:
ID Department_ID mod_date RowNum RowNum2
--------------------------------------------------
A 55 2016-05-20 1 1
B 55 2016-02-12 1 1
C 55 2016-10-05 1 2
Обратите внимание, что RowNum2
для ID = C
равно 2, поскольку это второй раз за период, когда C было 55, вы являетесь заинтересованы в том, где идентификатор ранее не был изменен на 55, так что вам нужно еще предикат RowNum2 = 1
дает окончательный запрос о:
SELECT ID,
Department_ID,
mod_date
FROM ( SELECT ID,
Department_ID,
mod_date,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY mod_date DESC),
RowNum2 = ROW_NUMBER() OVER(PARTITION BY ID, Department_ID ORDER BY mod_date)
FROM #T
WHERE mod_Date > '20151012'
) AS t
WHERE Department_ID = 55
AND RowNum = 1 -- CURRENT RECORD
AND RowNum2 = 1; -- FIRST TIME ID HAS BEEN THIS DEPARTMENT
полный рабочий DEMO
CREATE TABLE #T (ID CHAR(1), Department_ID INT, mod_date DATE);
INSERT #T
VALUES
('A', 33, '20140312'),
('A', 44, '20150423'),
('A', 55, '20160520'),
('B', 44, '20140126'),
('B', 33, '20150224'),
('B', 12, '20151224'),
('B', 55, '20160212'),
('C', 13, '20140522'),
('C', 14, '20150501'),
('C', 55, '20160702'),
('C', 14, '20160803'),
('C', 55, '20161005');
SELECT ID,
Department_ID,
mod_date
FROM ( SELECT ID,
Department_ID,
mod_date,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY mod_date DESC),
RowNum2 = ROW_NUMBER() OVER(PARTITION BY ID, Department_ID ORDER BY mod_date)
FROM #T
WHERE mod_Date > '20151012'
) AS t
WHERE Department_ID = 55
AND RowNum = 1 -- CURRENT RECORD
AND RowNum2 = 1; -- FIRST TIME ID HAS BEEN THIS DEPARTMENT
РЕЗУЛЬТАТЫ
ID Department_ID mod_date
----------------------------------
A 55 2016-05-20
B 55 2016-02-12
Что изменилось и какое действие нужно сделать? –
должно быть отслеживание предыдущего идентификатора деления, чтобы мы могли идентифицировать, если предыдущее значение равно 55 или нет. – Sherlock
. Дайте образец вывода на основе вашего примера ввода, а также того, что вы пробовали до сих пор, и объясните, как он не дает ожидаемых результатов – Dijkgraaf