java - SQL group by 替换不同的值

标签 java sql postgresql

是否可以对数据进行分组,但使用 PostgreSQL 将不同的值替换为(例如)@。还是使用 JAVA 会更好、更高效?

有下一个数据的表

 id  name1  f1  f2  f3  f4  f5
  1   lol    0   1   1    0   0
  2   lol    0   1   1    0   0
  3   lol    0   1   1    0   0
  4   kek    1   1   1    1   0
  5   kek    2   1   1    0   0
  6   kek    4   1   1    0   0
  7   kek    3   1   1    0   0

我需要用分组的相同数据检索名称,但不同的数据必须查看为 some char 例如:

  name1  f1  f2  f3  f4  f5
  lol    0   1   1   0   0
  kek    @   1   1   @   0

最佳答案

demo:db<>fiddle

SELECT 
    name, 
    CASE WHEN COUNT(DISTINCT f1) > 1 THEN '@' ELSE MAX(f1)::text END as f1,
    CASE WHEN COUNT(DISTINCT f2) > 1 THEN '@' ELSE MAX(f2)::text END as f2,
    CASE WHEN COUNT(DISTINCT f3) > 1 THEN '@' ELSE MAX(f3)::text END as f3,
    CASE WHEN COUNT(DISTINCT f4) > 1 THEN '@' ELSE MAX(f4)::text END as f4,
    CASE WHEN COUNT(DISTINCT f5) > 1 THEN '@' ELSE MAX(f5)::text END as f5
FROM
    my_table
GROUP BY name

对于每一列:

  1. 按名称分组
  2. 聚合 COUNT(DISTINCT) 计算不同的值
  3. 计数给出超过一个不同值的所有聚合都会产生您的新角色
  4. 其他人给出一个单一的值。 (因为你需要一个由 GROUP BY 引起的聚合函数。最简单的方法是取 MAXMIN,没关系 -只有一个值)。由于添加了 text 类型的值,所有其他值都必须转换为相同的列类型,因为不允许在一列中获取更多类型。所以如果你真的有 integer 值,最好也为你的“标记”值取一个 integer 值。如果您没有任何负值或类似的值,也许负值可以做到这一点。

关于java - SQL group by 替换不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53045322/

相关文章:

java - 如何在java中将两个不同的excel文件连接为同一服务器上的数据库?

sql - Scala with spark - "javax.servlet.ServletRegistration"的签名者信息与同一包中其他类的签名者信息不匹配

mysql - MySQL返回结果为NULL时选择默认值

java - 静态变量看不到

Java在索引文件中存储多个图像、配置文件等?

ruby-on-rails - 在 ActiveRecord 3 中添加自定义 SELECT

node.js - nodejs、postgres 和 Bluebird

postgresql - PG_DUMP 与主从复制的性能比较?

java - 如何在 iText 7 中创建/设置表格单元格和边框的自定义颜色?

mysql - 如何合并两个查询?