SQL Удалить записи из сгруппированных строк с условием - PullRequest
0 голосов
/ 27 июня 2019

У меня есть SQL-запрос, который возвращает количество записей, сгруппированных как показано ниже:

ID   USERNAME    PASSWORD    IDGROUP   LAST_LOGIN
1    1            XXX         999989   27/03/2019 3:55:28 PM
2    2            XXX         999989   27/03/2019 3:55:28 PM
3    3            XXX         999989   27/03/2019 3:55:28 PM
4    4            XXX         999977   27/03/2019 3:55:28 PM
5    5            XXX         999977   27/03/2019 3:55:28 PM
6    6            XXX         999976   27/03/2019 3:55:28 PM
7    7            XXX         999976   27/03/2019 3:55:28 PM
8    8            XXX         682849   17/05/2019 12:23:32 PM
9    9            XXX         682849   17/05/2019 12:23:32 PM
10   10           XXX         682849   28/05/2019 6:56:52 PM

РЕДАКТИРОВАТЬ: запрос, приведенный выше запись:

SELECT * 
FROM schemaN.tableX 
WHERE IDGROUP NOT IN (SELECT DISTINCT IDGROUP 
                      FROM (SELECT IDGROUP,COUNT (IDGROUP)OVER (PARTITION BY IDGROUP) cnt 
                            FROM schemaN.tableX
                      ) WHERE CNT=1) 
ORDER BY IDGROUP DESC;

Недавно был добавлен столбец last_login, и произошла ошибка, при которой во время создания столбца была добавлена ​​дата / время 27.03.2009 15:55:28 для всех записей, как показано выше.

В любой IDGROUP только один пользователь должен иметь доступ к логину. то есть для идентификатора 999989 у нас не может быть всех имен пользователей 1,2,3. У нас должен быть только один. У меня нет способа узнать, какое имя пользователя является правильным, поэтому я хочу проверить имя пользователя, которое вошло в систему последним, и удалить всех остальных пользователей для этого IDGROUP. т.е. для IDGROUP 682849, имя пользователя 10 останется, а пользователи 8 и 9 будут удалены.

Но для IDGROUP, например 999989, 999977 или 999976, которые имеют похожий LAST_LOGIN, я хочу проверить IDGROUP только с двумя именами пользователей и удалить только одну случайную запись, для любого другого IDGROUP, где пользователей больше 2, а LAST_LOGIN такой же, удалить все записи для этого IDGROUP из этой таблицы, например, удалить все записи с IDGROUP 999989, но удалить только одну случайную запись для IDGROUP 999977,999976.

Приведенная выше таблица является результатом запроса и содержит огромные записи, более 10 тыс. Записей. БД оракул 12с.

1 Ответ

0 голосов
/ 28 июня 2019

Это список последних входов в систему для каждой idgroup:

select idgroup, max(last_login) as last_login
from tableX
group by idgroup;

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

select max(username) as max_user, idgroup, last_login
from tablex
where (idgroup, last_login) in
          (select idgroup, max(last_login) as last_login
          from tableX
          group by idgroup)
group by idgroup, last_login
having count(distinct username)=1;

Итак, насколько я понимаю, вы хотите удалить все остальные записи:

delete from tablex where (username, idgroup, last_login) not in (
select max(username) as max_user, idgroup, last_login
from tablex
where (idgroup, last_login) in
              (select idgroup, max(last_login) as last_login
              from tableX
              group by idgroup)
group by idgroup, last_login
having count(distinct username)=1
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...