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