如果表有两个唯一值且其余列相同,如何从表中选择最小值

时间:2019-02-11 19:25:42

标签: sql hive hiveql

ex:输入

ID   Col1   Col2   Col3
--   ----   ----   ----
1       a     a     sql  
2       a     a    hive

输出

ID   Col1   Col2   Col3
--   ----   ----   ----
1       a     a     sql  

这里我的id值和Col3值是唯一的,但我需要根据最小id进行过滤并填充所有记录。

我知道以下方法可以使用,但除此以外的任何最佳方法都建议

通过Col1,Col2从表组中选择Col1,Col2,min(ID);

并将其加入ID,Col1,Col2

2 个答案:

答案 0 :(得分:1)

我认为您想要row_number()

select t.*
from (select t.*, row_number() over (partition by col1, col2 order by id) as seqnum
      from t
     ) t
where seqnum = 1

答案 1 :(得分:1)

Hive似乎支持ROW_NUMBER。尽管我从未使用过配置单元,但其他rdbms会像这样使用它来获取min行的全部内容而无需连接(如果重复使用最小值,则不会出现问题)

SELECT a.* FROM 
(
  SELECT *, ROW_NUMBER() OVER(ORDER BY id) rn FROM yourtable
) a
WHERE a.rn = 1

内部查询选择所有表数据并按照ID的顺序建立一个递增计数器。它可以基于任何列,最小ID(在这种情况下)为行号1。如果需要最大order by ID desc
如果您想重新启动另一列的不同值的数字(例如,您的Col3中有十个是“ sql”,二十行有“ hive”),请说PARTITION BY col3 ORDER BY id,并且行号将是一个计数器对于col3的相同值递增,对于col3的每个不同值从1重新开始