【问题标题】:Deduplicating rows using GROUP BY. Issue with Max()使用 GROUP BY 对行进行重复数据删除。 Max() 的问题
【发布时间】:2020-06-29 18:02:07
【问题描述】:
SELECT BVDID, max(case when CompanynameLatinalphabet='' then NULL else CompanynameLatinalphabet end) as CompanynameLatinalphabet, idField1, idField2 FROM `imported_companies_BVD` where BVDID=103327
group by BVDID, CompanynameLatinalphabet

大家好。在下面的声明中,我得到:

BVDID |公司名称拉丁字母 | idField1 | idField2 103327 |空 | 100 | 1 103327 | CASEIFICIO SOCIALE DI RAV... |空 | 1

如何防止检索到带有 NULL 的行?我不能在 where 语句中使用 IS NOT NULL,因为行中有其他列有数据。

整个想法是合并整个事物,两行中的值应该合并为单行。 如果您能提供帮助,谢谢!

预期的结果应该是:

BVDID |公司名称拉丁字母 | idfield1 | idfield2 103327 | CASEIFICIO SOCIALE DI RAV... | 100 | 1

【问题讨论】:

  • 我不能在 where 语句中使用 IS NOT NULL,因为该行中有其他列有数据。 跳过该行的实际完整标准是什么?你的意思是你想跳过那些有CompanynameLatinalphabetNULL 和NULL 的行吗?
  • 那么你期望的输出是什么?
  • 问题是存在混合值的行。我的意思是,相同的两行可以有一个 ID 为空且 ID 不为空。所以你会说“忽略 where 子句中 id 为 null 的那个。但是该行可以有有用的列并且不应该被忽略,所以整个想法是将所有不为 null 的内容合并到一行中。
  • 您的预期结果包含 2 列:idField1 和 idField2,查询中未提及。
  • 一个 BVID 是否存在超过 1 个非空和非空 CompanynameLatinalphabets 的情况?

标签: mysql group-by max


【解决方案1】:

为什么在 max 函数中使用 case 语句?如果值为空白,则返回空白而不是 null

【讨论】:

    【解决方案2】:

    如果您想排除CompanynameLatinalphabet 列中带有NULL 的行,您可以这样做:

    select *
    from (
      SELECT
        BVDID, 
        max(case when CompanynameLatinalphabet='' then NULL 
                 else CompanynameLatinalphabet end) as CompanynameLatinalphabet 
      FROM `imported_companies_BVD` 
      where BVDID=103327
      group by BVDID, CompanynameLatinalphabet
    ) x
    where CompanynameLatinalphabet is not null
    

    【讨论】:

    • 感谢穿刺者。看起来它有效。我不明白为什么封闭的 SELECT 会得到想要的结果,而实际上它只是在查询 SUB-SELECT。
    • @DiegoSendra 因为它处理列的聚合 [结果] 值,而不是未聚合值。这样过滤器就变得微不足道了。
    • 我看到的问题是,如果您使用 where 排除的行包含我想要检索的其他列,那么整行将被排除。
    • 有没有办法在 mysql 中混合两行,只忽略空值而不忽略整行?我认为 WHERE 不是要走的路
    • 请将预期结果添加到问题中。我已经不清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多