【问题标题】:How to mark duplicate values in another column MySQL如何在另一列 MySQL 中标记重复值
【发布时间】:2020-09-15 21:48:36
【问题描述】:

我查看了这个论坛,但找不到正确的答案。我正在寻找在一个列中查找重复值并在另一列中标记它们的最佳方法。

因此,如果有两个相同的订单 ID(它们包含不同的后缀:E - 电力和 G - 燃气),那么我需要标记“双燃料”。但是,如果订单 ID 只出现一次,那么我需要标记“Single”。

我有这些数据示例:

我尝试从订单 ID 中删除后缀 E 和 G 以获得正确的重复值,然后使用此方法:

SELECT *
FROM
  (SELECT Order_ID,
          left(Order_ID, length(Order_ID)-1) AS EX
   FROM my_table
   ORDER BY left(Order_ID, length(Order_ID)-1) DESC) d1
LEFT JOIN
  (SELECT Order_ID,
          left(Order_ID, length(Order_ID)-1) AS EXS,
          COUNT(left(Order_ID, length(Order_ID)-1)) AS external_count
   FROM my_table
   GROUP BY left(Order_ID, length(Order_ID)-1)
   HAVING COUNT(left(Order_ID, length(Order_ID)-1)) > 1) d2 ON d2.Order_ID= d1.Order_ID

多亏了这一点,我才能在下一列中获得订单 ID 和出现次数。 IF > 1 然后是 Dual Fuel,IF 小于 Single。

但这似乎不起作用而且很混乱,有没有最简单的方法来实现这样的事情?

谢谢, 帕维尔

【问题讨论】:

  • 我有这些数据示例: 提供格式为 CREATE TABLE + INSERT INTO 文本脚本的示例数据,而不是图片。
  • 第二个源列中的值是否严格匹配第一列中的后缀?第一列的值是否严格为 9 个字符?

标签: mysql


【解决方案1】:

您可以在CASE 表达式中使用EXISTS

select orderid,
  case 
    when exists (
      select 1 from tablename 
      where left(orderid, length(orderid) - 1) = left(t.orderid, length(t.orderid) - 1))
      and right(orderid, 1) <> right(t.orderid, 1) 
    )  then 'Dual Fuel'
    else 'Single' 
  end result
from tablename t

如果ids 的长度固定为 9 个字符,则可以简化代码:

select orderid,
  case 
    when exists (
      select 1 from tablename 
      where left(orderid, 8) = left(t.orderid, 8)
      and right(orderid, 1) <> right(t.orderid, 1) 
    )  then 'Dual Fuel'
    else 'Single' 
  end result
from tablename t

【讨论】:

  • 您好,第一个查询似乎有效,第二个查询无效,因为 id 长度不固定。第一个解决方案给了我 99% 的正确答案.. 有一些受影响的事件我有两个相同的订单 ID(在我删除后缀 E 和 G 之后)并且它仍然被标记为 Single。但无论如何,谢谢你的帮助。
  • @Pawel_L 条件:left(orderid, length(orderid) - 1) = left(t.orderid, length(t.orderid) - 1)) and right(orderid, 1) &lt;&gt; right(t.orderid, 1) 保证如果在删除最后一个字符后 2 个 id 相等且最后一个字符不相等,则该行将被标记为“双燃料”。所以问题不在于代码。您能否在小提琴中重现该问题:db-fiddle.com
  • 我想我知道问题出在哪里 - 一些订单 ID 损坏(旧条目),它们的后缀错误。当我排除错误的 ID 时,我得到 100% 正确的结果。成功了,非常感谢。帕维尔
猜你喜欢
  • 2014-06-14
  • 2018-07-12
  • 2019-04-20
  • 2016-11-13
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多