Как проверить, включает ли данная дата хотя бы каждую группу документов, указанную для пользователя? - PullRequest
0 голосов
/ 25 декабря 2018

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

DocID    UserID     StartDAte     EndDAte     OfficialName
1        1         10/1/18       10/3/18       A
2        1         10/5/18       10/10/18      A
3        1         10/1/18       10/9/18       B
4        1         10/1/18       10/9/18       C
5        1         10/1/18       10/5/18       D
6        1         10/7/18       10/20/18      D

Существует 4 группы документов, а именно, A, B, C, D.Необходимо проверить, находится ли заданная дата по крайней мере в каждом из документов в каждой группе.

eg date : 10/2/18 is in first record of A,B,C, and first record of D. So it is passed.
eg date : 10/4/18 is not in either of documents in A hence failed.
eg date : 10/8/18 is second document in A,B,C, and second document in D hence passed.
eg date : 10/6/18 is in A but not in D hence failed.

Поскольку я должен написать это для данного пользователя и даты, я должен использовать предложение "IN" для "OfficialName ", но как я могу добавить" ИЛИ ", чтобы проверить дату в любом из файлов в каждой группе" OfficialName "для всех документов для данного пользователя?

Любая помощь приветствуется.Нужно добавить что-то непонятное.Количество документов на Официальное наименование не установлено.Это может быть один или много.

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

вы можете использовать это:

SELECT count(DISTINCT t.officialname)
  FROM elbat t
  WHERE @date between t.startDate  AND t.enddate and
     t.userid = @userId;
0 голосов
/ 25 декабря 2018

Я думаю, что вы хотите:

select (case when count(distinct t.officialname) = 4 then 'passed' else 'failed' end) as flag_4groups
from t
where @date <= t.startdate and
      @date >= t.enddate and
      t.user_id = @user;

Если вы хотите это для всех пользователей (кроме определенной даты):

select t.user_id,
       (case when count(distinct t.officialname) = 4 then 'passed' else 'failed' end) as flag_4groups
from t
where @date <= t.startdate and
      @date >= t.enddate
group by t.user_id
0 голосов
/ 25 декабря 2018

Объединяйте и получайте отчетливое количество групп.Если вы получаете 4, у вас есть совпадение, в противном случае у вас нет.

SELECT count(DISTINCT t.officialname)
       FROM elbat t
       WHERE t.userid = <given user>
             AND t.startdate <= <given date>
             AND t.enddate >= <given date>;

Вы также можете добавить HAVING count(DISTINCT t.officialname) = 4, чтобы получить пустой набор, если и только если нет совпадения.

...