【问题标题】:sum values with case insensitive join not grouping correctly不区分大小写的连接的总和值未正确分组
【发布时间】:2020-02-18 10:51:59
【问题描述】:

我想以不区分大小写的方式加入两个表。感谢关于 SO 的其他主题,这正在使用 lower()。但是,结果未按小写值分组,但似乎仍区分大小写。如何调整查询以使分组不区分大小写?

示例数据: 表 1(目前仅使用该表的 1 列,但还有更多元数据;):

keyword
TEST
ABC
ASF
QWERTY

表2:

Date - term - value
2020-01-01 - test - 3
2020-01-01 - Test - 2
2020-01-03 - TEST - 4
2020-01-01 - abc - 6
2020-01-02 - ABC - 7
2020-01-02 - abc - 3

期望的输出:

keyword - sum(value)
test - 9
abc - 16

当前输出:

keyword - sum(value)
test - 3
test - 2
test - 4
abc - 9
abc - 7

我正在使用的查询:

select distinct lower(keyword), value
FROM Table1 t1
join (select lower(term) term, sum(value) value from Table2 group by term) t2 on lower(t1.keyword) = lower(t2.term) 
GROUP BY t2.term, t1.keyword, t2.value

似乎所有输出需求都是(另一个)分组,但无论我是否分组,它都不会改变结果。我在这里错过了什么?

【问题讨论】:

    标签: postgresql join group-by


    【解决方案1】:

    这里有一个简单的选择是将连接条件的两边都小写:

    SELECT
        t1.keyword,
        SUM(t2.value) AS total
    FROM table1 t1
    LEFT JOIN table2 t2
        ON LOWER(t1.keyword) = LOWER(t2.term)
    GROUP BY
        t1.keyword;
    

    请注意,在连接的多个位置使用LOWER 可能意味着您的查询将无法使用任何索引。为获得最佳性能,请考虑将您的关键字/字词数据以相同的大小存储在任何地方。

    【讨论】:

    • 这给了我错误的总和,很可能是因为加入的产品?这就是我最终使用 distinct 和 subquery 的方式
    • 不...如果第一个表中的关键字是主键或唯一的,那么我的查询应该适合您。如果我可能在这里遗漏一些东西,也许可以添加更真实的示例数据。
    • 你是对的......重复数据删除出了点问题。修复了它,您的查询按预期工作
    【解决方案2】:

    如果您想按降低的值分组,也可以在 GROUP BY 中使用 lower()。您的查询也可以简化。不需要派生表或DISTINCT

    SELECT lower(t1.keyword),
           sum(t2.value) value
           FROM table1 t1
                INNER JOIN table2 t2
                           ON lower(t1.keyword) = lower(t2.term)
           GROUP BY lower(t1.keyword);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2016-08-28
      • 2022-08-14
      • 1970-01-01
      • 2013-03-06
      • 2020-02-18
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多