【问题标题】:SQL query: Identify duplicate values and also show the values in column that is not duplicatedSQL查询:识别重复值并显示列中不重复的值
【发布时间】:2018-07-27 16:10:38
【问题描述】:

我正在分析 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 查询而言,它可以像另一列一样处理)。

在此示例中,我将使用 datainput_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

(所以在输出中,我不需要看到data3data4,因为它们没有重复。)

我发现要识别重复项,我可以执行以下操作:

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

但是我还没有找到一种方法来识别具有不同计数 > 1 的值,然后打印出那些不同的值(因为识别计数 >1 需要聚合,但是打印不同的值需要 un-聚合)。是否可以在单个查询中完成?

【问题讨论】:

    标签: sql hadoop


    【解决方案1】:

    我会倾向于使用窗口函数:

    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;
    

    【讨论】:

    • 如果特定的 data-input_date 对有超过 2 个不同的 input_file_names,这是否有效?看起来您只是在比较两个文件名(最小值和最大值),但一个数据对可能有 3 或 4 个 input_file_names。
    • @andraiamatrix 。 . .是的,它适用于任何数字。最小值和最大值会有所不同。
    • 我测试了它,看起来它正在工作。谢谢!
    【解决方案2】:

    你可以使用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
                     );
    

    【讨论】:

    • 我收到此错误:Error while compiling statement: FAILED: SemanticException [Error 10249]: Line 10:24 Unsupported SubQuery Expression 'INPUT__FILE__NAME': SubQuery expression refers to both Parent and SubQuery expressions and is not a valid join condition. 特别指倒数第二行t1.INPUT__FILE__NAME &lt;&gt; t.INPUT__FILE__NAME
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多