Изменение порядка sql-запроса по элементам, с которыми связано большинство других

#sql #teradata

#sql #teradata

Вопрос:

У меня есть таблица с двумя столбцами, A и B. Каждому элементу в A соответствует один или несколько элементов в B. Я хочу изменить порядок таблицы так, чтобы у меня были элементы в A, с которыми связано большинство элементов в B.

Пример:

 Car     Blue
Home    Red
Home    Pink
Car     Yellow
Home    White
Bike    Blue
  

Я хочу вывести:

 Home    Red
Home    Pink
Home    White
Car     Blue
Car     Yellow
Bike    Blue
  

Какой SQL-запрос мне нужно вызвать, чтобы изменить порядок таблицы таким образом? (Это в teradata, на случай, если это имело значение).
Мне нужно добавить, что с каждым элементом в A может быть связана одна или несколько строк с одним и тем же элементом B, я хочу, чтобы количество было различным.

Пример:

 Car     Blue
Car     Blue
Home    Red
Home    Pink
Home    Pink
Car     Yellow
Home    White
Bike    Blue
  

Должно возвращать то же самое, что указано выше.

Ответ №1:

Вот один трюк с использованием COUNT() OVER() оконной агрегированной функции

 select * from yourtable
Order by COUNT(1) OVER(PARTITION BY A) DESC
  

Ответ №2:

Вы, кажется, хотите:

 order by count(distinct b) over (partition by a) desc
  

Однако я не думаю, что это работает в Teradata:

 select t.*
from (select t.*,
             row_number() over (partition by a, b order by a) as seqnum
      from t
     ) t
order by sum(case when seqnum = 1 then 1 else 0 end) over (partition by a);
  

Ответ №3:

Вам просто нужно удалить дубликаты перед подсчетом. As GROUP BY all columns то же самое, что DISTINCT вы можете использовать это:

 SELECT colA, colB
FROM tab
GROUP BY 1,2
ORDER BY Count(*) Over (PARTITION BY colA) DESC 
  

Ответ №4:

Вот как я бы это сделал:

 SELECT
col1,
col2
FROM (
SELECT
col1,
col2,
1 AS rn
FROM
<your table>) t
GROUP BY 1,2
ORDER BY 1,SUM(rn) DESC
  

Это позволяет нам получить «количество» строк для каждого пересечения col1 / col2. Это приводит к:

 Bike    Blue
Car     Blue
Car     Yellow
Home    Pink
Home    Red
Home    White
  

Комментарии:

1. Но это просто сложный способ сделать SELECT col1,col2 FROM tab GROUP BY 1,2 ORDER BY 1, COUNT(*) DESC ?