pgsql根据一个表的三个字段去重,显示这个表的所有字段并算则另个一字段的中间值作为重复值的返回值
时间: 2023-11-27 22:50:11 浏览: 37
假设我们有一个表名为`mytable`,包含以下字段:
- `id`:唯一标识符
- `name`:姓名
- `age`:年龄
- `city`:城市
- `salary`:工资
要根据`name`、`age`、`city`三个字段去重,并显示该表的所有字段,以及计算`salary`字段的中位数作为重复值的返回值,可以使用以下SQL语句:
```
SELECT
id,
name,
age,
city,
salary,
CASE
WHEN COUNT(*) OVER (PARTITION BY name, age, city) > 1
THEN PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary)
OVER (PARTITION BY name, age, city)
ELSE NULL
END AS median_salary
FROM mytable
GROUP BY name, age, city, id, salary
```
解释一下:
- `GROUP BY name, age, city, id, salary`:根据`name`、`age`、`city`、`id`、`salary`五个字段进行分组,保证不重复。
- `COUNT(*) OVER (PARTITION BY name, age, city)`:使用窗口函数统计每个`name`、`age`、`city`组中的记录数。
- `PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY name, age, city)`:使用窗口函数计算每个`name`、`age`、`city`组中`salary`字段的中位数。如果该组中只有一个记录,则中位数为NULL。
- `CASE WHEN COUNT(*) OVER (PARTITION BY name, age, city) > 1 THEN ... END AS median_salary`:根据分组中的记录数判断是否为重复记录,如果是,则将该组的中位数赋值给`median_salary`字段,否则为NULL。