微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为每个 SID 删除除 2 之外的所有行降序

如何解决为每个 SID 删除除 2 之外的所有行降序

我有一张这种结构的表。每个 SID 都有不同的 ITEMID

| sid | itemid |
|---| ---------|
| 1 | 20600    |
| 1 | 20598    |
| 1 | 20597    |
| 1 | 20596    |
| 1 | 20595    |
| 1 | 20594    |
...
...
| 2 | 19600    |
| 2 | 19598    |
| 2 | 19597    |
| 2 | 19596    |
| 2 | 19595    |
| 2 | 19594    |
...
...

我需要的是删除除最后 2 行之外的所有行,其中 ITEMID 以 DESCENDING 方式排序。 这是我想要获得的结果:

| sid | itemid |
|---| ---------|
| 1 | 20600    |
| 1 | 20598    |
| 2 | 19600    |
| 2 | 19598    |

谢谢 安德里亚

解决方法

在 MySQL 8+ 上,我们可以尝试使用 ROW_NUMBER 进行删除连接:

DELETE t1
FROM yourTable t1
INNER JOIN
(
    SELECT sid,itemid,ROW_NUMBER() OVER (PARTITION BY sid ORDER BY itemid DESC) rn
    FROM yourTable
) t2
    ON t2.sid = t1.sid AND t2.itemid = t1.itemid
WHERE
    t2.rn > 2;
,
DELETE t0
FROM test t0
JOIN ( SELECT t1.sid,( SELECT itemid
                FROM test t2
                WHERE t1.sid = t2.sid
                ORDER BY itemid DESC LIMIT 1,1 ) itemid
       FROM ( SELECT DISTINCT t3.sid
              FROM test t3 ) t1 ) t4 USING (sid)
WHERE t0.itemid < t4.itemid;

https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=c6d67da817ddbb9fb890693564bcd49c

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。