Поиск пользователя с max (Audit_Date) и датой вне диапазона - PullRequest
1 голос
/ 30 октября 2019

Я работаю над SQL-запросом, в котором максимальное значение Audit_Date пользователя не находится в диапазоне, так как в течение длительного времени они не использовали систему. Я попробовал это так:

SELECT DISTINCT 
UserID
,max(Audit_Date)
FROM   RV_USERS RV_USERS
INNER JOIN RV_AUDIT RV_AUDIT ON 
RV_USERS.UserID=RV_AUDIT.UserID
group BY RV_USERS.UserID

AND --it doesn't like the "and" here
not exists(
select *
FROM   RV_USERS RV_USERS
INNER JOIN RV_AUDIT RV_AUDIT ON  ON RV_USERS.UserID=RV_AUDIT.UserID
where 
Audit_Date not between '2019-05-29 00:00:00' and '10/29/2019' 
)

Я пытался использовать не существует, как в примере , но это не работает в этом случае. Я получил неправильный синтаксис рядом с ключевым словом «И», прямо перед тем, как не существует. Мне нужно сделать из этого представление, так что я думаю, что переменные и временные таблицы отсутствуют. Он будет использоваться в подробном отчете и запланирован в Central Management Console.

** Update1: пробовал это для каждого ответа: ВЫБЕРИТЕ DISTINCT "RV_USERS". "UserID", "RV_AUDIT". "Audit_Date" FROM "RV_USERS "" RV_USERS "ВНУТРЕННИЙ РЕЙТИНГ" RV_AUDIT "" RV_AUDIT "ON" RV_USERS "." UserID "=" RV_AUDIT "." UserID "

group BY" RV_USERS "." UserID "," RV_AUDIT "."Audit_Date "

HAVING max (" RV_AUDIT "." Audit_Date ") <'2019-05-29 00:00:00' </p>

и" RV_USERS ".UserID = 'me'

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

** Обновление 2: Попробовал это для другого ответа:

SELECT DISTINCT 
"RV_USERS"."UserID"
,max("RV_AUDIT"."Audit_Date")
FROM   "RV_USERS" "RV_USERS" 
INNER JOIN "RV_AUDIT" "RV_AUDIT" ON "RV_USERS"."UserID"="RV_AUDIT"."UserID"
WHERE  

not exists(
select *
FROM   "RV_USERS" u2 
INNER JOIN "RV_AUDIT" a2 ON u2."UserID"=a2."UserID"
where 
a2."Audit_Date" not between '2019-05-27 00:00:00' and '10/31/2019' 
)
group BY "RV_USERS"."UserID"

Это ничего не возвращает, но мызнаю, что есть менеджеры, которые не использовали систему.

** Обновление 3 за ответ:

SELECT DISTINCT 
u."UserID"
,max(a."Audit_Date")
FROM   "RV_USERS" u 
INNER JOIN "RV_AUDIT" a ON u."UserID"=a."UserID"
WHERE  
u.UserID not in(

select u2.UserID

FROM   "RV_USERS" u2 
INNER JOIN "RV_AUDIT" a2 ON u2."UserID"=a2."UserID"
where 
a2."Audit_Date" between '2019-05-27 00:00:00' and '10/31/2019' 
)
group BY u."UserID"

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Я бы предложил предложение having:

SELECT UserID, max(Audit_Date)
FROM RV_USERS RV_USERS INNER JOIN
     RV_AUDIT RV_AUDIT 
     ON RV_USERS.UserID = RV_AUDIT.UserID
GROUP BY RV_USERS.UserID
HAVING max(Audit_Date) < '2019-05-29';

Ваш запрос кажется гораздо более сложным, чем необходимо.

1 голос
/ 30 октября 2019

У вас более одной ошибки, здесь исправлен код:

SELECT DISTINCT 
       RV_U.UserID
       , max(RV_U.Audit_Date)
FROM   RV_USERS RV_U
INNER JOIN RV_AUDIT RV_A ON RV_U.UserID=RV_A.UserID
WHERE
NOT EXISTS(
    SELECT *
    FROM   RV_USERS RV_USERS
    INNER JOIN RV_AUDIT RV_AUDIT ON RV_USERS.UserID=RV_AUDIT.UserID
    WHERE Audit_Date not between '2019-05-29 00:00:00' and '10/29/2019' 
)
GROUP BY RV_U.UserID;
  • Ваша строка NNER JOIN RV_AUDIT RV_AUDIT ON ON RV_USERS.UserID=RV_AUDIT.UserID имеет ON два раза.
  • GROUP BY должно идтив конце
  • AND следует заменить на WHERE

Попробуйте применить эти изменения.

0 голосов
/ 30 октября 2019

Замените and предложением where и поместите группу в последний раз, чтобы приведенный выше запрос выполнялся как минимум

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...