![](/img/trans.png)
[英]How do I create a new table in SQL using the row values of another table as column names (dynamic)?
[英]How do I create a new SQL table with custom column names and populate these columns
所以我目前有一个 SQL 语句,该语句生成一个表,其中包含表中出现频率最高的值以及最不频繁出现的值。 但是,此表有 2 行,其中包含行值和字段。 我需要创建一个自定义表,其中包含 2 列,最小值和最大值。 然后有一行,每行一个值。 这些列的值需要来自同一行。
(SELECT name, COUNT(name) AS frequency
FROM firefighter_certifications
GROUP BY name
ORDER BY frequency DESC limit 1)
UNION
(SELECT name, COUNT(name) AS frequency
FROM firefighter_certifications
GROUP BY name
ORDER BY frequency ASC limit 1);
因此,对于上述查询,我需要一行中的最小值和最大值的名称。 我还需要能够为生成的 SQL 查询定义新列的名称。
Min_Name | Max_Name
Certif_1 | Certif_2
我认为这个查询应该给你你想要的结果。 它根据每个名称在表中出现的次数对每个名称进行排名,然后使用条件聚合到 select 一行中的最小和最大频率名称:
with cte as (
select name,
row_number() over (order by count(*) desc) as maxr,
row_number() over (order by count(*)) as minr
from firefighter_certifications
group by name
)
select max(case when minr = 1 then name end) as Min_Name,
max(case when maxr = 1 then name end) as Max_Name
from cte
Postgres 不提供“第一个”和“最后一个”聚合函数。 但是还有其他类似的方法:
select distinct first_value(name) over (order by cnt desc, name) as name_at_max,
first_value(name) over (order by cnt asc, name) as name_at_min
from (select name, count(*) as cnt
from firefighter_certifications
group by name
) n;
或者根本没有任何子查询:
select first_value(name) over (order by count(*) desc, name) as name_at_max,
first_value(name) over (order by count(*) asc, name) as name_at_min
from firefighter_certifications
group by name
limit 1;
这是一个 db<>fiddle
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.