Запросы для того, кто работал над предметом первым и вторым - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть таблица, которая выглядит так:

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;

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

Я думал, что смогу достичь этого за один запрос, но не думаю.

1 Ответ

2 голосов
/ 13 декабря 2011

Попробуйте это:

select 
t1.ReviewedBy FirstReviewer,
t2.ReviewedBy SecondReviewer
from
Table t1
left outer join Table t2 on t1.Item_Id = t2.Item_Id and t2.ReviewDateTime > t1.ReviewDateTime

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

Если ReviewDateTime никогда не обновляется, а Id является столбцом идентификаторов, вы можете изменить объединение, чтобы присоединиться к Id, а не ReviewDateTime, что будет быстрее.

...