我有一个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。
答案 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
);