是否可以对数据进行分组,但使用 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
最佳答案
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
对于每一列:
- 按名称分组
- 聚合
COUNT(DISTINCT)
计算不同的值 - 计数给出超过一个不同值的所有聚合都会产生您的新角色
- 其他人给出一个单一的值。 (因为你需要一个由
GROUP BY
引起的聚合函数。最简单的方法是取MAX
或MIN
,没关系 -只有一个值)。由于添加了text
类型的值,所有其他值都必须转换为相同的列类型,因为不允许在一列中获取更多类型。所以如果你真的有integer
值,最好也为你的“标记”值取一个integer
值。如果您没有任何负值或类似的值,也许负值可以做到这一点。
关于java - SQL group by 替换不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53045322/