SQL从带条件的分组行中删除记录

时间:2019-06-27 15:44:19

标签: sql oracle

我有一个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/2019 3:55:28 PM。

在任何IDGROUP中,只有一个用户有权登录。即,对于ID 999989,我们不能拥有所有的用户名1,2,3。我们应该只有一个。 我没有办法知道哪个用户名是正确的,因此,我想检查上次登录的用户名并删除该IDGROUP的所有其他用户。即,对于IDGROUP 682849,将保留用户名10,并删除用户8和9。

但是对于IDGROUP(如999989或999977或999976),它们具有相似的LAST_LOGIN,我想仅使用2个用户名检查IDGROUP,并且只删除一个随机条目,对于用户数超过2且其他LAST_LOGIN相同的其他IDGROUP,则删除该表中该IDGROUP的所有记录,例如,删除所有IDGROUP 999989的记录,但仅删除IDGROUP 999977,999976的单个随机记录。

上表是查询结果,具有庞大的记录,超过1万条记录。 数据库是oracle 12c。

1 个答案:

答案 0 :(得分:0)

这是每个idgroup的最近登录列表:

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

这是为那些单独拥有该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
);