【问题标题】:How to return distinct rows with a specific condition?如何返回具有特定条件的不同行?
【发布时间】:2020-04-23 12:20:41
【问题描述】:

我有一个如下所示的表格:

| FIELD_1 | FIELD_2 | FIELD_3 | FIELD_4 |
|---------|---------|---------|---------|
|   NULL  |   NULL  | potato  |  apple  |
|  basket |  fruit  | potato  |  apple  |
|   NULL  |   NULL  | potato  |  apple  |
|.........|.........|.........|.........|

FIELD_3FIELD_4 始终被填充。

我想通过此表并获取所有字段的 DISTINCT 值,但对于填充了 FIELD_1FIELD_2 的行,仅获取该字段集而不是 NULL。

对于上表只返回:

|  basket |  fruit  | potato  |  apple  |

如果该行在FIELD_3FIELD_4 中仅填充了土豆和苹果。

过去我用内部连接做过类似的事情,我只保留FIELD_1FIELD_2 的最大行,但现在字段是字符串,我想检查值是否为NULL与否。

有什么想法吗?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    嗯。 . .如果我理解正确,当有任何其他值时,您想过滤掉前两列中的 NULL 值。但如果没有,你想保留它们:

    select t.*
    from (select t.*,
                 count(field_1) over (partition by field_3, field_4) as cnt_field_1,
                 count(field_2) over (partition by field_3, field_4) as cnt_field_2,
                 row_number() over (partition by field_3, field_4, field_1, field_2) as seqnum
          from t
         ) t
    where seqnum = 1 and
          ( (field_1 is not null or field_2 is not null) or
            (cnt_field_1 = 0 and cnt_field_2 = 0)
          );
    

    【讨论】:

      【解决方案2】:
      #standardSQL
      SELECT DISTINCT *
      FROM `project.dataset.table`
      WHERE NOT FIELD_1 IS NULL AND NOT FIELD_2 IS NULL
      

      【讨论】:

      • 我接受了上述内容,但似乎没有注册。我认为在您的解决方案中,如果 'FIELD_1'、'FIELD_2' 对于一组 'FIELD_3'、'FIELD_4' 为 NULL 并且该组没有其他非 'NULL' 值,它不会返回 'NULL'' FIELD_1', 'FIELD_2' 如我所愿。戈登的回答似乎是这样做的。
      • 当然,没问题。不过,这个问题并不清楚:o)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2020-07-23
      • 2014-08-25
      • 2014-08-24
      相关资源
      最近更新 更多