Поиск статистики для данных в таблице PostgreSQL.Уникальное количество и наибольшая частота на столбец - PullRequest
0 голосов
/ 01 октября 2018

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

Давайте представим, что у нас есть таблица со столбцами: A, B, C.

A     B      C
--------------------
Red   Red    Red
Red   Blue   Red
Blue  Green  Red
Blue  Green  Red

Я бы хотел вывод, который говорит, сколько уникальных значений для A, B и C в виде отдельных столбцов.Таким образом, было бы выдано

2, 3, 1
  • 2 уникальных значения для A (красный и синий)
  • 3 уникальных значения для B (красный, синий и зеленый)
  • 1 уникальное значение для C (красный)

Есть ли в любом случае, чтобы получить это в один вызов.

Кроме того, я хотел бы получитьчастота наиболее распространенного значения:

2, 2, 4
  • 2, потому что есть 2 красных (или синих, то же значение),
  • 2, потому что есть 2 зеленых,
  • 4, потому что в том же или другом запросе 4 красных

.

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

Есть ли эффективный способ сделать это?

1 Ответ

0 голосов
/ 01 октября 2018

Сколько уникальных значений существует для каждого столбца, используя aggregate functiions & DISTINCT:

select
  count(distinct a) as cnt_a,
  count(distinct b) as cnt_b,
  count(distinct c) as cnt_c
from yourtable

Возвращает:

2,3,1

Частота наиболее распространенного значения с использованием window functions & aggregate functiions:

select 
  max(cnt_a) as fr_a,
  max(cnt_b) as fr_b,
  max(cnt_c) as fr_c
from (
  select
    count(*) over (partition by a) as cnt_a,
    count(*) over (partition by b) as cnt_b,
    count(*) over (partition by c) as cnt_c
  from yourtable
) t

Возвращает:

2,2,4

В сочетании с UNION ALL:

select
  'unique values' as description,
  count(distinct a) as cnt_a,
  count(distinct b) as cnt_b,
  count(distinct c) as cnt_c
from yourtable
union all
select
  'freq of most common value',
  max(cnt_a),
  max(cnt_b),
  max(cnt_c)
from (
  select
    count(*) over (partition by a) as cnt_a,
    count(*) over (partition by b) as cnt_b,
    count(*) over (partition by c) as cnt_c
  from yourtable
) t

Возвращает:

        description        | cnt_a | cnt_b | cnt_c
---------------------------+-------+-------+-------
 unique values             |     2 |     3 |     1
 freq of most common value |     2 |     2 |     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...