У меня есть таблица, которая выглядит так:
Id (PK, int, not null)
ReviewedBy (nvarchar(255), not null)
ReviewDateTime(datetime, not null)
Decision_id (int, not null)
Item_id (FK, int, not null)
Бизнес-процесс с этой таблицей заключается в том, что каждый Item
(обозначенный Item_id
внешним ключом) должен обрабатываться 2 людьми.
Как я могу запросить эту таблицу, чтобы определить, кто (ReviewedBy
) первым просмотрел элемент, а кто - второй.
Я действительно изо всех сил пытаюсь это выяснить, потому что я пренебрегал добавлением столбца Type
в мою таблицу, который бы определял, как пользователь действует. (
Редактировать
Учитывая следующие данные
Id,ReviewedBy,ReviewedWhen,SomeOtherId,
16,111111,2011-12-14 22:06:54,1,
17,187935,2011-12-14 22:07:03,1,
18,187935,2011-12-14 22:07:18,2,
19,187935,2011-12-14 22:07:20,3,
20,111111,2011-12-14 22:07:23,2,
21,187935,2011-12-14 22:07:26,3,
22,123456,2011-12-14 22:27:50,4,
со схемой
CREATE TABLE [Reviews] (
[Id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[ReviewedBy] NVARCHAR(6) NOT NULL,
[ReviewedWhen] TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
[SomeOtherId] INTEGER NOT NULL
);
Выполнение следующего для получения списка людей, которые сделали вторые обзоры, вернет строки, в которых есть только один отзыв для SomeOtherId
.
select t1.*
from Reviews as t1
left outer join Reviews as t2
on (t1.SomeOtherId = t2.SomeOtherId and t1.ReviewedWhen < t2.ReviewedWhen)
where t2.SomeOtherId is null;
Решение
-- First checks
select t1.ReviewedBy, count(t1.Id)
from Reviews as t1
left outer join Reviews as t2
on (t2.SomeOtherId = t1.SomeOtherId and t1.ReviewedWhen > t2.ReviewedWhen)
where t2.SomeOtherID is null
group by t1.ReviewedBy;
-- Second checks
select t1.ReviewedBy, count(t1.Id)
from Reviews as t1
left outer join Reviews as t2
on (t2.SomeOtherId = t1.SomeOtherId and t1.ReviewedWhen < t2.ReviewedWhen)
where t2.SomeOtherID is null
and t1.Id not in (select Id from Reviews group by SomeOtherId having count(SomeOtherId) = 1)
group by t1.ReviewedBy;
По сути, это были подсчеты предметов, где был только один обзор как в качестве первой, так и второй проверки. Все, что мне нужно было сделать, это убедиться, что при подсчете вторых проверок я не включаю строки только с одной проверкой.
Я думал, что смогу достичь этого за один запрос, но не думаю.