У меня есть таблица, которая содержит действия пользователя на основе дат. Таблица используется в качестве временной шкалы событий. В следующем примере показано, как два человека меняли свои рабочие должности с течением времени:
DECLARE @tbl TABLE (
UserID int,
ActionID int,
ActionDesc nvarchar(50),
ActionDate datetime
);
INSERT INTO @tbl (UserID, ActionID, ActionDesc, ActionDate)
VALUES
-- First person
(1, 200, 'Promoted', '2000-01-01'),
(1, 200, 'Promoted', '2001-01-01'),
(1, 200, 'Promoted', '2002-02-01'),
(1, 300, 'Moved', '2004-03-01'),
(1, 200, 'Promoted', '2005-03-01'),
(1, 200, 'Promoted', '2006-03-01'),
-- Second person
(2, 200, 'Promoted', '2006-01-01'),
(2, 300, 'Moved', '2007-01-01'),
(2, 200, 'Promoted', '2008-01-01');
SELECT * FROM @tbl ORDER BY UserID, ActionDate DESC;
Это дает следующее, показанное как самое последнее событие первым:
Мне нужно показать таблицу в обратном порядке дат, но удалить все события, которые происходят непосредственно после того, как они уже произошли, на основе совпадения [UserID / ActionID]. Например, если этого человека повысили, а затем снова повысили сразу после этого, второе повышение не будет включено в результаты, поскольку оно будет считаться дубликатом предыдущего действия.
Следовательно, желаемый результат:
После исследования я попытался ROW_NUMBER()
идентифицировать дубликаты:
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY UserID, ActionID ORDER BY ActionDate ASC) AS RowNum
FROM
@tbl
ORDER BY
UserID, ActionDate DESC;
... Но это не совсем работает, так как нумерация не сбрасывается после каждого отдельного действия. Возможно, я слишком обдумываю это, но борюсь за вдохновение, потому что результаты поиска возвращают множество вопросов, где люди просто удаляют дубликаты из списков.