【问题标题】:SQL Delete records from grouped rows with conditionSQL从有条件的分组行中删除记录
【发布时间】:2019-06-27 15:44:19
【问题描述】:

我有一个 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 将被删除。

但是对于像 999989 或 999977 或 999976 这样具有相似 LAST_LOGIN 的 IDGROUP,我想检查只有 2 个用户名的 IDGROUP,并且只删除一个随机条目,对于用户超过 2 个且 LAST_LOGIN 相同的任何其他 IDGROUP,删除此表中该 IDGROUP 的所有记录,例如删除 IDGROUP 999989 的所有记录,但仅删除 IDGROUP 999977,999976 的单个随机记录。

上表是查询结果,记录很大,一万多条。 数据库是 oracle 12c。

【问题讨论】:

  • 您希望如何处理IDGROUP= 999989 的情况,其中前 3 个用户名具有它,并且 LAST_LOGIN 也具有相同的值?
  • 如果上次登录相同,我想删除该 IDGROUP 的所有记录

标签: sql oracle


【解决方案1】:

这是每个 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
);

【讨论】:

  • 海纳,谢谢。但我做了一点改变。我现在只想删除 IDGROUP 有超过 2 个用户名的所有记录。任何其他只有 2 个用户名的 IDGROUP,我只想随机删除其中一个用户名。
  • 这很容易改变。 “有计数(不同的用户名)=1”=>“有计数(不同的用户名)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2015-11-18
  • 2011-09-20
相关资源
最近更新 更多