按大多数其他元素关联的元素重新排序sql查询

时间:2016-10-20 00:56:04

标签: sql teradata

我有一个包含两列A和B的表。 对于A中的每个元素,对应于B中的一个或多个元素。 我想重新排序表格,以便在A中包含与B中大多数元素相关联的A中的元素。

示例:

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

我想输出:

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

我需要通过这种方式调用以重新排序表的SQL查询是什么? (这是teradata,如果有所作为)。 我需要将它添加到A中的每个元素,可能会有一个或多个行具有相同的元素B,我想要不同的计数。

示例:

DEBUG = False 

...

STATIC_ROOT = '/home/huhu/webapps/eng30_static_media/static'
MEDIA_ROOT =  '/home/huhu/webapps/eng30_static_media/media'

STATIC_URL = '/static/'
MEDIA_URL = '/media/'

应该返回与上面相同的内容。

4 个答案:

答案 0 :(得分:1)

以下是使用COUNT() OVER()窗口聚合函数

的一个技巧
select * from yourtable
Order by COUNT(1) OVER(PARTITION BY A) DESC

答案 1 :(得分:0)

你似乎想要:

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);

答案 2 :(得分:0)

您只需在计数前删除重复项。由于GROUP BY all columnsDISTINCT相同,您可以使用此代码:

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

答案 3 :(得分:0)

以下是我的观点:

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

这让我们得到一个&#34;计数&#34;每个col1 / col2交集的行数。结果是:

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