繁体   English   中英

如何使用自定义列名创建新的 SQL 表并填充这些列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM