Я пытаюсь написать запрос SQL, который отслеживает использование учетной записи в JIRA.Я все еще довольно новичок, когда дело доходит до SQL, поэтому, пожалуйста, потерпите меня :)
Я могу получить количество входов в систему для пользователей, которые вошли в систему. Однако мне не очень повезло, включаяучетные записи, которые никогда не использовались.
Ниже приведен пример таблицы cwd_user_attributes - это таблица, содержащая количество входов в систему, дату последнего входа в систему и т. Д. Как только пользователь входит в систему, "входит в систему.count " появится в столбце attribute_name .Однако, если пользователь никогда не входил в систему, например user_id 19313 (AKA user Dave) , 'login.count' не существует.
+-------+---------+-------------------------------+-----------------+
| ID | user_id | attribute_name | attribute_value |
+-------+---------+-------------------------------+-----------------+
| 17378 | 10000 | lastAuthenticated | 1524069213477 |
| 17382 | 10000 | login.count | 2576 |
| 17380 | 10000 | login.lastLoginMillis | 1524069213493 |
| 17377 | 10000 | requiresPasswordChange | FALSE |
| 23542 | 16714 | lastAuthenticated | 1525888024307 |
| 23549 | 16714 | login.count | 1927 |
| 23548 | 16714 | login.lastLoginMillis | 1525888024322 |
| 23537 | 16714 | requiresPasswordChange | FALSE |
| 27555 | 19313 | password.reset.request.expiry | 1494599702231 |
| 27554 | 19313 | passwordLastChanged | 1494513302168 |
| 27552 | 19313 | requiresPasswordChange | FALSE |
+-------+---------+-------------------------------+-----------------+
Я пытаюсь написать запрос, который будет возвращать значение attribute_value, когда строка 'login.count' присутствует в столбце имя_атрибута И будеттакже возвращает результат '0' , если нет 'login.count' строки.
Это то, что у меня есть до сих пор.К сожалению, и понятно, что это не касается моего пользователя 19313 / Dave.
SELECT
u.user_name AS [USER NAME]
,m.parent_name AS [GROUP]
,ua.attribute_value AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM jira.cwd_user AS u LEFT JOIN
jira.cwd_user_attributes AS ua ON u.ID = ua.user_id LEFT JOIN
jira.cwd_membership AS m ON u.ID = m.child_id AND u.directory_id = m.directory_id LEFT JOIN
jira.cwd_directory AS d ON m.directory_id = d.ID
WHERE (d.active = '1') AND (u.active = '1') AND (m.parent_name <> 'non-jira-users') AND (ua.attribute_name = 'login.count')
РЕЗУЛЬТАТЫ
+-----------+-------------+-------------------------+-------------------------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+-------------------------+-------------------------+
| Mark | 2576 | 2012-09-26 17:06:11.400 | 2012-09-26 17:06:11.400 |
| Joe | 1927 | 2016-06-21 11:41:03.897 | 2016-04-19 13:31:21.847 |
+-----------+-------------+-------------------------+-------------------------+
Проведя тонну исследований, я подумал, что предложение "WHIS EXISTS" будет моим лучшимставка.И, если я удаляю * "(ua.attribute_name = 'login.count')" из предложения WHERE, он возвращает всех пользователей (ууу!), Но также возвращает все атрибуты_имя какЧто ж.И очевидно, что это не создает строку «login.count» ...
SELECT
u.user_name AS [USER NAME]
,m.parent_name AS [GROUP]
,CASE
WHEN EXISTS
(SELECT ua.attribute_value
WHERE ua.attribute_name = 'login.count')
THEN ua.attribute_value
ELSE 0
END AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM jira.cwd_user AS u LEFT JOIN
jira.cwd_user_attributes AS ua ON u.ID = ua.user_id LEFT JOIN
jira.cwd_membership AS m ON u.ID = m.child_id AND u.directory_id = m.directory_id LEFT JOIN
jira.cwd_directory AS d ON m.directory_id = d.ID
WHERE (d.active = '1') AND (u.active = '1') AND (m.parent_name <> 'non-jira-users')
РЕЗУЛЬТАТЫ
+-----------+-------------+------------+-----------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+------------+-----------+
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Mark | 2576 | 2/14/2019 | 9/26/2012 |
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Joe | 1927 | 2/14/2019 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
+-----------+-------------+------------+-----------+
Я пытаюсьчтобы достичь конечной цели:
+-----------+-------------+------------+-----------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+------------+-----------+
| Mark | 2576 | 9/26/12 | 9/26/12 |
| Joe | 1927 | 6/21/16 | 4/19/16 |
| Dave | 0 | NULL | 5/11/2017 |
+-----------+-------------+------------+-----------+
Извиняюсь за роман - постарался включить как можно больше необходимой информации :) Спасибо заранее!
РЕДАКТИРОВАНИЕ2/15/19 Прочитав ответ Чака, я попробую его предложение.Я еще не там, но я, по крайней мере, на правильном пути?Извинения - это все новое для меня.
Спасибо!
SELECT
u.user_name AS [USER NAME]
,ua.attribute_value AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM dbo.cwd_user AS u LEFT JOIN
dbo.cwd_user_attributes AS ua ON u.ID = ua.user_id
LEFT JOIN
(SELECT
,CASE
WHEN EXISTS
(
SELECT ua1.attribute_value
WHERE ua1.attribute_name = 'login.count'
)
THEN ua1.attribute_value
ELSE 0
END AS [LOGIN COUNT]
FROM dbo.cwd_user AS u1 LEFT JOIN
dbo.cwd_user_attributes AS ua1 ON u1.ID = ua1.user_id
) AS sq
ON ua.attribute_value = sq.attribute_value
WHERE (u.active = '1') AND (ua.attribute_name = 'login.count')