【问题标题】:Delete next row if values are less than previous row如果值小于上一行,则删除下一行
【发布时间】:2016-11-03 16:54:21
【问题描述】:

例子,

    SELECT * FROM stats_table
order by accuracy desc, totals desc;

这是按精度降序排列,总计降序

它返回以下内容

id  col_a       amount  col_b       accuracy   totals
881 stat_a      38.0    stat_b      71.60       162 
884 stat_a      39.0    stat_b      70.52       173 
109 stat_a      38.0    stat_b      69.91       105 
880 stat_a      38.0    stat_b      69.88       249 
883 stat_a      39.0    stat_b      69.47       262 

如果准确度和总计都低于上面的行,我希望删除该行,因此从示例中,id 109 应该被删除,因为准确度和总计都低于上面的行,id 884

所以结果应该是这样的

id  col_a       amount  col_b       accuracy   totals
881 stat_a      38.0    stat_b      71.60       162 
884 stat_a      39.0    stat_b      70.52       173 
880 stat_a      38.0    stat_b      69.88       249 
883 stat_a      39.0    stat_b      69.47       262 

理想情况下,由于有 1000 行,它应该循环遍历整个表。

请帮忙

【问题讨论】:

  • 如何定义这个样本数据的顺序?
  • 它是按精度降序排列的,总计降序
  • 向我们展示预期的结果(使用该表数据)。
  • 你确定吗?这意味着它只会保留第一行。
  • 你说上面那一行,但是我们怎么知道顺序呢?显然不是id order...

标签: mysql sql


【解决方案1】:

要按照您描述的方式进行操作,您可以分配一个行号:

select *
from stats_table
where id in (
  select a.id
  from (SELECT *, row_number()over(order by accuracy desc, totals desc) as row FROM stats_table) a
  inner join (SELECT *, row_number()over(order by accuracy desc, totals desc) as row FROM stats_table) b
  on a.row = b.row + 1
  and a.accuracy < b.accuracy
  and a.total < b.total
)

然后,当您很高兴您要删除的行已被选中时,您只需将“select *”替换为“delete from”(由于显而易见的原因,我无法测试代码)。

【讨论】:

  • 感谢您的回复,我在 SQL 语法中收到错误 1064。
  • @Vorpulus:恐怕mysql没有窗口函数。
  • 哦,对了。我能想到的唯一另一件事是使用identity column。祝你好运。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 2018-08-17
  • 2021-04-21
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多