postgresql 在一个查询中选择所有属性的所有唯一值

hs1ihplo  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(168)

我有一个表,我想在一个查询中选择所有属性的所有唯一值。
例如,具有3列name, age, city的表Person
示例:
| 姓名|年龄|城市|
| - ------|- ------|- ------|
| 亚历克斯|三十四|纽约|
| 狮子座|三十四|伦敦|
| 罗伊|二十个|伦敦|
| 亚历克斯|二十八|莫斯科|
| 迈克|三十六|伦敦|
我想得到一个每个属性都有唯一值的结果
| 姓名|年龄|城市|
| - ------|- ------|- ------|
| 亚历克斯|二十个|纽约|
| 狮子座|二十八|伦敦|
| 罗伊|三十四|莫斯科|
| | 三十六||
是否可以执行此查询?
我尝试用DISTINCTUNION进行一些查询,但结果总是行的乘积。

mrzz3bfm

mrzz3bfm1#

这不是关系数据库的工作方式,但有时您必须做您必须做的事情。
您可以:

select a.name, b.age, c.city
from (select distinct name, row_number() over() as rn from t) a
full join (select distinct age, row_number() over() as rn from t) b on b.rn = a.rn
full join (select distinct city, row_number() over() as rn from t) c
  on c.rn = coalesce(a.rn, b.rn)
j8ag8udp

j8ag8udp2#

一个选项是聚合到数组中,然后取消嵌套这些数组:

select x.*
from (
  select array_agg(distinct name) as names, 
         array_agg(distinct age) as ages,
         array_agg(distinct city) as cities
  from the_table
) d
  cross join lateral unnest(d.names, d.ages, d.cities) with ordinality as x(name, age, city);

如果确实有许多不同的值(“millows”),我认为这会相当慢,但如果只期望很少的不同值(“bunders”或“thousand”),那么这可能是可以的。

相关问题