当前位置: 首页 > 知识库问答 >
问题:

mysql - 如何在SQL中根据条件去重并保留特定条件的数据?

楚灿
2024-08-27

sql如果有重复数据,怎么根据需要去重,比如no相同,优先保留code为b的

五条数据四条code a 一条code b 其中code b的no和code a重复了,最后应该是四条数据,其中三条code a一条code b

共有1个答案

李星辰
2024-08-27

在SQL中,如果你需要根据特定条件去重并保留特定条件的记录(如你提到的no相同的情况下优先保留codeb的记录),你可以使用ROW_NUMBER()窗口函数或者RANK()窗口函数结合OVER()子句来实现。这里,使用ROW_NUMBER()可能更合适,因为它能为每个分组内的行分配一个唯一的序号,基于你指定的排序顺序。

下面是一个具体的SQL示例,假设你的表名为your_table,它包含nocode两列:

WITH RankedData AS (
    SELECT
        *,
        ROW_NUMBER() OVER(PARTITION BY no ORDER BY CASE WHEN code = 'b' THEN 1 ELSE 2 END, code) AS rn
    FROM
        your_table
)
SELECT
    no,
    code
FROM
    RankedData
WHERE
    rn = 1;

解释

  1. CTE(公用表表达式): 这里使用了一个CTE(WITH RankedData AS (...))来首先处理原始数据。CTE是SQL中的一种临时结果集,它在查询执行期间存在。
  2. ROW_NUMBER(): ROW_NUMBER()函数用于为分区内的每一行分配一个唯一的序号。PARTITION BY no表示我们按照no列的值将数据分组,即每个no值对应一组数据。ORDER BY CASE WHEN code = 'b' THEN 1 ELSE 2 END, code表示在每个分组内,我们首先按照code是否为b进行排序(b排在前面),如果code相同,则按code本身的值排序(这里主要是为了保证排序的稳定性,虽然在这个场景下可能不需要)。
  3. 选择: 最后,从CTE中选择nocode列,但只选择那些rn = 1的行,即每个no分组中序号为1的行,也就是根据我们的排序规则,首先被排序出来的行(即codeb的行,如果存在的话)。

这样,你就可以根据no去重,并在每个no分组中优先保留codeb的记录(如果存在),否则保留其他code的记录。

 类似资料:
  • 我以前使用Netlogo,有一些非常好的内置方法,允许我从总人口中筛选和控制所需的代理。(见:http://ccl.northwestern.edu/netlogo/docs/dictionary.html#agentsetgroup).例如,我可以很容易地用简单的代码在模拟中命令不同级别的人员代理,例如: 在Repast中,是否有专门为方便控制代理集而构建的方法列表?

  • 问题内容: 我正在编写一个小的AngularJS应用,该应用具有登录视图和主视图,其配置如下: 我的LoginController检查用户/密码组合,并在$ rootScope上设置一个属性,以反映此情况: 一切正常,但是如果我访问,最终将绕过登录屏幕。我想写一些类似的内容,“每当路由更改时,如果$ rootScope.loggedUser为null,则重定向到/ login” … …等等。我可以

  • 问题内容: 我有一张地图,如下所示: 如您所见,将有一个名为split的最终常量,其值为40 我必须实现逻辑,例如,如果映射的值达到40,那么从计算开始的映射的第一个键以及恰好达到40的键也将被选择为min和max,如上所述。 。 除此之外,如果总和超过40,则需要格外小心。如果是,我们必须忽略它,并且在最小值和最大值相等的情况下,将先前的值本身作为最小值和最大值。 请建议我如何使用Java和。乡

  • 本文向大家介绍一条sql语句完成MySQL去重留一,包括了一条sql语句完成MySQL去重留一的使用技巧和注意事项,需要的朋友参考一下 前几天在做一个需求的时候,需要清理mysql中重复的记录,当时的想法是通过代码遍历写出来,然后觉得太复杂,心里想着应该可以通过一个sql语句来解决问题的。查了资料,请教了大佬之后得出了一个很便利的sql语句,这里分享下这段sql语句和思路。 需求分析 数据库中存在

  • 问题内容: 这个问题似乎让人难以置信,但我无法弄清楚。我知道您可以在python中检查数据类型,但是如何根据数据类型设置条件呢?例如,如果我必须编写一个对字典/列表进行排序并将所有整数加起来的代码,那么如何隔离搜索以仅查找整数? 我想一个简单的例子看起来像这样: 那么对于第3行,我将如何设置这样的条件? 问题答案: 怎么样, 但更干净的方法就是

  • 我用AnyLogic创建了一个简单的模型(见截图)。现在我想添加一个条件,选择服务块中的两个资源集中的一个。例如,以下场景应适用:如果队列中有5个以上的部件,工作人员3和工作人员4应执行服务。如果有的话

  • 问题内容: 我有一个名为@status的变量,该变量在此select语句之前设置: 我只想选择if列,否则我想为shipwith选择null。我该如何完成? 问题答案:

  • 关于如何只使用一个条件就获得所需的代理集,有一个答案:Repast:如何根据特定条件获得特定的代理集? 这样的事情如何在多种条件下工作?(例如问rich_people[财富