我在配置单元的一个表中有多个列,大约有80列。我需要在一些列上应用distinct子句,并从其他列中获取第一个值。下面是我想要达到的目标。
select distinct(col1,col2,col3),col5,col6,col7 from abc where col1 = 'something';
上面提到的所有列都是文本列。所以我不能应用groupby和aggregate函数。
kulphzqa1#
你可以用 row_number 函数来解决问题。
row_number
create table temp as select *, row_number() over (partition by col1,col2,col3) as rn from abc where col1 = 'something'; select * from temp where rn=1
也可以在分区时对表进行排序。 row_number() over (partition by col1,col2,col3 order by col4 asc) as rn
row_number() over (partition by col1,col2,col3 order by col4 asc) as rn
pxyaymoc2#
distinct是sql中使用最多、理解最少的函数。它是在整个结果集中执行的最后一个操作,并使用select中的所有列删除重复项。你可以用一个字符串来分组,事实上这就是答案:
SELECT col1,col2,col3,COLLECT_SET(col4),COLLECT_SET(col5),COLLECT_SET(col6) FROM abc WHERE col1 = 'something' GROUP BY col1,col2,col3;
不过,现在我又读了你的问题,我真的不确定你到底在找什么。您可能需要将表连接到其自身的聚合。
2条答案
按热度按时间kulphzqa1#
你可以用
row_number
函数来解决问题。也可以在分区时对表进行排序。
row_number() over (partition by col1,col2,col3 order by col4 asc) as rn
pxyaymoc2#
distinct是sql中使用最多、理解最少的函数。它是在整个结果集中执行的最后一个操作,并使用select中的所有列删除重复项。你可以用一个字符串来分组,事实上这就是答案:
不过,现在我又读了你的问题,我真的不确定你到底在找什么。您可能需要将表连接到其自身的聚合。