Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何正确地从嵌套表中获取唯一的行?_Sql_Google Bigquery - Fatal编程技术网

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

Sql 如何正确地从嵌套表中获取唯一的行?,sql,google-bigquery,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是名为cols 我想用standa

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

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

我想用standardSQL展平数据,然后只获取数据的唯一组合
DATE(mytimestamp)
col2
col3

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

版本1(非最新版本)

带有
groupby
的版本返回
4236104
结果。 没有
分组依据的版本返回
1107740805
结果

版本2(非最新+不同)

无论是否使用
groupby
它都会返回
875301
结果

第3版(无非最新+不同)

无论是否使用
groupby
它都会返回
875301
结果

第4版(无不可见+无不可见)

带有
groupby
的版本返回
4236104
结果。 没有
分组依据的版本返回
1107740805
结果

从结果和我所知道的情况来看,由于
DISTINCT
适用于所有列,因此无论是否使用
groupby
,我都会得到相同的结果

但是为什么版本1
和GROUPBY
给我的结果与版本2或3不同呢

对于我想做的事情,哪个版本是正确的/最好的?我猜是2或3,因为返回的行较少,但为什么


感谢

下面是BigQuery标准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     

科尔斯专栏只是记录还是重复记录?@MikhailBerlyant这是重复记录。将编辑!在这种情况下,是否因为应用了DISTINCT,所以左边的连接不起作用?我只是不明白,因为它不知道在哪里加入我怎么才能不看到重复的。即使我添加了更多的日期,其中一个有“xxxx”,而另一个没有,它仍然知道。它适用于加入未列出字段的情况,因为它“某种程度上”与该字段所在的行连接is@Lev,您可能希望添加包含更多日期和列的数据示例,以查看此答案中的查询是否适用于该情况。@rsantiago我这样做了,并且成功了。我不知道为什么“它”从Mikhal所说的“加入那个字段是行”。@列夫-如果它帮助和接受它,那么考虑一下投票的答案——同时,它是这样工作的,因为这就是在BigQuy中设计的特性。
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
#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