【发布时间】: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 的所有记录