postgresql 使用SQL通过LIMIT查询获取每列的唯一值

xu3bshqb  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(3)|浏览(247)

我在PostgreSQL中有以下格式的表:

Name    Age Gender  Occupation
John    32  Male    Software Engineer
Sarah   26  Female  Graphic Designer
David   41  Male    Sales Manager
Emily   29  Female  Marketing Coordinator
Michael 37  Male    Project Manager

我想在使用limit时从查询结果的每一列中获得所有唯一值。这在postgresql中可以实现吗?
例如,我的查询应该是这样的:

SELECT * FROM my_table
WHERE Gender = 'Male'
LIMIT 2;

我希望获得每列的所有唯一值,而不管我的限制:

Name: John, David, Michael
Age: 32, 41, 37
Occupation: Software Engineer, Sales Manager, Project Manager
Gender: Male

如何使用SQL做到这一点?

iswrvxsc

iswrvxsc1#

这里使用的是string_agg。如果更相关,您可以使用另一个聚合函数。

select
    string_agg(distinct "name", ',') "names",
    string_agg(distinct age::text, ',') ages,
    string_agg(distinct gender, ',') genders,
    string_agg(distinct occupation, ',') occupations
from the_table;

参见demo
不相关,但在表中保存年龄并不是一个好主意,因为它一直在变化。最好有出生日期并使用年龄函数计算年龄。

mgdq6dx1

mgdq6dx12#

您可以使用以下查询来获取每个列的唯一值,

SELECT 
  (SELECT DISTINCT name FROM my_table LIMIT 1) AS name,
  (SELECT DISTINCT age FROM my_table LIMIT 1,1) AS age,
  (SELECT DISTINCT occupation FROM my_table LIMIT 2,1) AS occupation,
  ...
FROM my_table
LIMIT 1

此查询使用带有DISTINCT关键字的子查询为每列选择非重复值,并将它们分配给单独的列别名(column_1、column_2、column_3等)。LIMIT关键字用于指定要为每列选择的唯一值的数量。
Note表示此查询假设表中的所有列具有相同的数据类型。
此外,对于具有大量列或大量不同值的表,此查询可能效率不高。

zzwlnbp8

zzwlnbp83#

你可以使用子查询,完全忽略外部where子句:

SELECT
    (SELECT STRING_AGG (distinct Name,', ') FROM my_table) Name,
    (SELECT STRING_AGG (distinct Age,', ') FROM my_table) Age,
    (SELECT STRING_AGG (distinct Occupation,', ') FROM my_table) Occupation,
    gender
FROM
    my_table
WHERE 
    Gender = 'Male'
LIMIT 2;

**编辑:**要忽略LIMIT,您可以使用CTE。

WITH t AS
(
    SELECT * 
    FROM my_table
    WHERE Gender = 'Male'
)
SELECT
    (SELECT STRING_AGG (distinct Name,', ') FROM t) Name,
    (SELECT STRING_AGG (distinct Age,', ') FROM t) Age,
    (SELECT STRING_AGG (distinct Occupation,', ') FROM t) Occupation,
    gender
FROM  
    t
LIMIT 2;

相关问题