Как создать новую таблицу SQL с настраиваемыми именами столбцов и заполнить эти столбцы - PullRequest
0 голосов
/ 06 мая 2020

Итак, в настоящее время у меня есть оператор 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

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Я думаю, этот запрос должен дать вам желаемый результат. Он ранжирует каждое имя в соответствии с тем, сколько раз оно появляется в таблице, затем использует условное агрегирование для выбора имен минимальной и максимальной частоты в одной строке:

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
0 голосов
/ 06 мая 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...