SQL-запрос для получения количества повторяющихся записей на основе других факторов
-
07-07-2019 - |
Вопрос
У меня есть таблица (участники), в которой есть несколько столбцов, которые все могут быть разными.Два столбца, которые представляют особый интерес в этом запросе, - это userId и programID Здесь у меня запрос из двух частей.
- Я хочу иметь возможность получить список всех идентификаторов пользователей, которые появляются более одного раза в этой таблице.Как мне это сделать?
Я хочу иметь возможность получить количество всех идентификаторов программы, где один и тот же идентификатор пользователя отображается в нескольких идентификаторах программы.(Тоестьколичество программ, в которых один и тот же идентификатор пользователя отображается в 2 программах, количество программ, в которых один и тот же идентификатор пользователя отображается в 3 программах и т.д.) Например:
programID: prog1 userID: uid1 userID: uid3 userID: uid12 programID: prog2 userID: uid3 userID: uid5 userID: uid14 userID: uid27 programID: prog3 userID: uid3 userID: uid7 userID: uid14 userID: uid30 programID: prog4 userID: uid1
Ожидаемые результаты:Количество идентификаторов пользователя = 2;программы = 3 Количество идентификаторов пользователя = 3;программы = 3
Кто-нибудь, пожалуйста, может помочь мне с этим.
мой текущий код для вопроса 1 таков:
SELECT
WPP.USERID,
WPI.EMAIL,
WPI.FIRSTNAME,
WPI.LASTNAME,
WPI.INSTITUTION
FROM WEBPROGRAMPARTICIPANTS WPP
INNER JOIN WEBPERSONALINFO WPI
ON WPP.USERID = WPI.USERID
INNER JOIN WEBPROGRAMS WP
ON WPP.PROGRAMCODE = WP.PROGRAMCODE
WHERE
WP.PROGRAMTYPE IN ('1','2','3','4','5','6', '9', '10')
GROUP BY
WPP.USERID,
WPI.EMAIL,
WPI.FIRSTNAME,
WPI.LASTNAME,
WPI.INSTITUTION
HAVING COUNT(WPP.USERID) > 1
ORDER BY WPI.EMAIL
Решение 3
Это была проблема с моей стороны, с логическим шагом, который был пропущен.
Другие советы
1.
select userID , SUM(userID ) AS Count
from Preparations
group by userID where Count > 1
Ваш запрос для первой части выглядит хорошо. Вот ваш запрос для части 2:
SELECT DISTINCT p1.programID, COUNT(p1.userID) AS Multiple
FROM participants p1
JOIN participants p2 ON p2.userID = p1.userID
GROUP BY p1.userID, programID
ORDER BY Multiple, programID
В нем указывается номер идентификатора программы и количество других идентификаторов программ, в которых этот идентификатор указан для каждого идентификатора программы. Я думаю, что ваши ожидаемые результаты не соответствуют вашим данным. Должно быть:
userID count = 1; программы = 3; userID count = 2; программы = 4; userID count = 3; программы = 3;
Вы можете использовать вышеперечисленное в качестве подзапроса (производной таблицы), если хотите более точно настроить результаты, чтобы они больше походили на ожидаемые результаты.