如何正确从嵌套表中获取唯一行?

时间:2019-11-27 15:48:19

标签: sql google-bigquery

我有一个名为A的表,看起来像这样:

|       mytimestamp       | col2 | col3 |
|=========================|======|======|
| 2019-11-27 14:30:00 UTC | xxxx | yyyy |
| ....................... | .... | .... |
| 2019-11-27 14:42:28 UTC | tttt | zzzz |

col3是名为REPEATED RECORD的{​​{1}}的一部分

我想用standardSQL整理数据,然后仅获取的唯一组合 colsDATE(mytimestamp)col2

下面是我运行的查询的4个不同版本以及返回的不同结果的数量:

版本1 (嵌套)

col3

带有SELECT DATE(mytimestamp) AS my_date ,col2 ,c.col3 AS as un_col3 FROM my_dataset.A ,UNNEST(cols) AS c -- Adding this will return different results. -- GROUP BY -- my_date -- ,col2 -- ,un_col3 的版本返回了GROUP BY个结果。 没有4236104的版本返回了GROUP BY个结果。

版本2 (嵌套+不重复)

1107740805

无论是否有SELECT DISTINCT DATE(mytimestamp) AS my_date ,col2 ,c.col3 AS as un_col3 FROM my_dataset.A ,UNNEST(cols) AS c -- Adding this will return the same results. -- GROUP BY -- my_date -- ,col2 -- ,un_col3 ,它都会返回GROUP BY个结果。

版本3 (没有嵌套+唯一)

875301

无论是否有SELECT DISTINCT DATE(mytimestamp) AS my_date ,col2 ,c.col3 AS as un_col3 FROM my_dataset.A ,A.cols AS c -- Adding this will return the same results. --GROUP BY -- my_date -- ,col2 -- ,un_col3 ,它都会返回GROUP BY个结果。

第4版(没有嵌套+没有区别)

875301

带有SELECT DATE(mytimestamp) AS my_date ,col2 ,c.col3 AS as un_col3 FROM my_dataset.A ,A.cols AS c -- Adding this will return different results. --GROUP BY -- my_date -- ,col2 -- ,un_col3 的版本返回了GROUP BY个结果。 没有4236104的版本返回了GROUP BY个结果。

根据结果和我所知道的,由于1107740805适用于所有列,因此无论是否具有DISTINCT,我都会得到相同的结果。

但是为什么版本1 GROUP BY会给我与版本2或3不同的结果。

哪个版本是我想要做的正确/最佳版本?我猜是2或3,因为返回的行较少,为什么?

谢谢

1 个答案:

答案 0 :(得分:1)

以下内容适用于BigQuery Standard SQL,并根据所需的逻辑产生正确的结果

#standardSQL
SELECT DISTINCT DATE(mytimestamp) mydate, col2, col3
FROM `project.dataset.table`
LEFT JOIN UNNEST(cols)

作为测试-是否适用于以下过于简化的伪数据

WITH `project.dataset.table` AS (
  SELECT TIMESTAMP '2019-11-27 14:30:00 UTC' mytimestamp, 'xxxx' col2, [STRUCT('yyyy' AS col3), STRUCT('zzzz')] cols UNION ALL
  SELECT '2019-11-27 14:30:00 UTC', 'xxxx', [STRUCT('yyyy')] UNION ALL
  SELECT '2019-11-27 14:42:28 UTC', 'tttt', [STRUCT('zzzz'), STRUCT('zzzz')] 
)

结果将是

Row mydate      col2    col3     
1   2019-11-27  xxxx    yyyy     
2   2019-11-27  xxxx    zzzz     
3   2019-11-27  tttt    zzzz