sql查询:标识重复的值,并在列中显示不重复的值

n9vozmp4  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(452)

我正在分析hadoop中的数据。有一些重复条目,其中a、b列重复,c列不同。我要做的是只识别a,b重复项,然后为每个重复项打印出c列的不同值。
样本数据:

row,  data, input_date, INPUT__FILE__NAME
  0, data1,   20180702,         LOCATION1
  1, data1,   20180702,         LOCATION2
  2, data1,   20180702,         LOCATION2

  3, data2,   20180702,         LOCATION1
  4, data2,   20180702,         LOCATION1
  5, data2,   20180702,         LOCATION2
  6, data2,   20180702,         LOCATION3
  7, data2,   20180702,         LOCATION3

  8, data3,   20180702,         LOCATION2

  9, data4,   20180702,         LOCATION3

(注意 INPUT__FILE__NAME hadoop中数据来源的文件位置的元数据值。以备不时之需。但据我所知,它可以像sql查询中的另一列一样处理)。
在这个例子中,我将使用 data 以及 input_date 识别重复项。我想看清楚 INPUT__FILE__NAME 他们中的每一个。
期望的输出(如果不同的输出有意义,输出的结构可以改变——我只需要不同的 INPUT_FILE_NAME 值):

data, input_date, INPUT__FILE__NAME
   data1,   20180702,         LOCATION1
   data1,   20180702,         LOCATION2
   data2,   20180702,         LOCATION1
   data2,   20180702,         LOCATION2
   data2,   20180702,         LOCATION3

(所以在输出中,我不需要看到 data3 也不是 data4 因为它们不是重复的。)
我发现,要识别重复项,我可以执行以下操作:

SELECT data, input_date, count(DISTINCT INPUT__FILE__NAME)
FROM table
GROUP BY data, input_date
HAVING count(DISTINCT INPUT__FILE__NAME)>1;

但是,我还没有找到一种方法,既可以识别出具有distinct count>1的值,又可以打印出那些不同的值(因为识别count>1需要聚合,但是打印这些不同的值需要取消聚合)。是否可以在单个查询中执行?

bnlyeluc

bnlyeluc1#

我倾向于使用窗口功能:

select distinct data, input_date, input__file__name
from (select t.*,
             min(input__file__name) over (partition by data, input_date) as min_ifn,
             max(input__file__name) over (partition by data, input_date) as max_ifn
      from t
     ) t
where min_ifn <> max_ifn;
mm5n2pyu

mm5n2pyu2#

你可以用 union all :

select distinct t.data, t.input_date, t.INPUT__FILE__NAME
from table t
union all
select distinct t.data, t.input_date, t.INPUT__FILE__NAME
from table t
where not exists (select 1 
                  from table t1 
                  where t1.data = t.data and 
                        t1.input_date = t.input_date and
                        t1.INPUT__FILE__NAME <> t.INPUT__FILE__NAME
                 );

相关问题