Как сгруппировать указанные c SQL столбцы и получить строки с наибольшим количеством этих столбцов? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть следующие данные:

col_1 | col_2 | col_3 | col_4
-----------------------------
a1      b1      c1      d1
a1      b2      c1      d1
a1      b3      c1      d1
a1      b4      c1      d2
a1      b5      c2      d2
a1      b6      c2      d2
a1      b7      c1      d3
a1      b8      c2      d3
a1      b9      c3      d3
a1      b10     c1      d2
a1      b11     c2      d3
a2      b12     c1      d1
a3      b13     c1      d1

Меня интересует возможность:

  • Возвращать строки, в которых значение col_1 уникально
  • Для каждой строки в результате он должен возвращать значения для столбцов с наибольшим числом при группировании по: col_3, col_4

Например, я хотел бы получить вывод чтобы вернуть следующее:

col_1 | col_2 | col_3 | col_4
-----------------------------
a1      b1      c1      d1
a2      b12     c1      d1
a3      b13     c1      d1

В результате обратите внимание, что каждое значение в col_1 уникально. Также обратите внимание, что для a1 он вернулся с c1 и d1, так как они имели наибольшую группу по подсчетам для a1.

Как я могу добиться этого с помощью запроса SQL? Я буду использовать его для запроса Hive SQL.

Ответы [ 3 ]

1 голос
/ 23 марта 2020

С row_number() оконной функцией:

select t.col_1, t.col_2, t.col_3, t.col_4
from (
  select col_1, min(col_2) col_2, col_3, col_4,
    row_number() over (partition by col_1 order by count(*) desc) rn
  from tablename
  group by col_1, col_3, col_4
) t
where t.rn = 1

См. Демоверсию . Результаты:

| col_1 | col_2 | col_3 | col_4 |
| ----- | ----- | ----- | ----- |
| a1    | b1    | c1    | d1    |
| a2    | b12   | c1    | d1    |
| a3    | b13   | c1    | d1    |
1 голос
/ 23 марта 2020

Вы можете использовать оконные функции, если хотите получить полные строки:

select t.*
from (select t.*,
             rank() over (partition by col1 order by cnt desc) as seqnum
      from (select t.*, count(*) over (partition by col1, col3, col4) as cnt
            from t
           ) t
     ) t
where seqnum = 1;

Самый внутренний подзапрос подсчитывает количество строк для каждой комбинации col1 / col3 / col4. Средний подзапрос перечисляет строки с наибольшим количеством для каждого col1. Внешние фильтры для наибольшего количества.

1 голос
/ 23 марта 2020

Вы можете использовать функции агрегации и окна:

select col_1, col_2, col_3, col_4
from (
    select
        col_1, 
        col_2, 
        col_3, 
        col_4, 
        rank() over(partition by col_1 order by count(*) desc) rn
    from mytable t
    group by col_1, col_2, col_3, col_4
) t
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...