#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
?