Sql SOTorrent:只选择那些带有;安卓;标签?
数据集:——这是数据集(托管在Google的BigQuery上):您可以在那里运行查询,然后再运行。它有一个Posts表。虽然我已经尝试解释了下面的相关字段,但是可以在这里找到Posts表的详细模式供您参考: 所以:堆栈溢出 背景:数据集有一个名为Posts的表。在该表中,存在一个字段PostTypeId:Sql SOTorrent:只选择那些带有;安卓;标签?,sql,google-bigquery,Sql,Google Bigquery,数据集:——这是数据集(托管在Google的BigQuery上):您可以在那里运行查询,然后再运行。它有一个Posts表。虽然我已经尝试解释了下面的相关字段,但是可以在这里找到Posts表的详细模式供您参考: 所以:堆栈溢出 背景:数据集有一个名为Posts的表。在该表中,存在一个字段PostTypeId: 如果该字段为1,则表示我们现在查看的帖子是发布在SO上的问题。在这种情况下,另一个名为Tags的字段将包含由SO上问题的OP分配的标签 如果该字段为2,则它是发布在SO上的答案。在这种情况
- 如果该字段为1,则表示我们现在查看的帖子是发布在SO上的问题。在这种情况下,另一个名为Tags的字段将包含由SO上问题的OP分配的标签
- 如果该字段为2,则它是发布在SO上的答案。在这种情况下,标记字段将为空
SELECT
p.Id,
p.Score,
p.body
FROM
[sotorrent-org:2018_09_23.Posts] p
WHERE
p.Tags LIKE "%android%"
AND p.PostTypeId = 2
LIMIT
10
但是,很明显,上面的查询将返回null
,因为WHERE子句检查不能共存的条件。如果帖子有标签,就不能是答案。如果它是一个答案,它不能有标签
如何绕过此问题并检查同一表上的两个互斥条件?您需要使用
ParentId
字段将posts表连接到自身:
#standardSQL
SELECT
answer.Id
, answer.Score
, answer.body
FROM
`sotorrent-org.2018_09_23.Posts` question
JOIN
`sotorrent-org.2018_09_23.Posts` answer
ON
answer.ParentId=question.Id
AND answer.PostTypeId=2
AND question.PostTypeId=1
WHERE
question.Tags LIKE "%android%"
AND question.PostTypeId = 1
AND answer.PostTypeId = 2
LIMIT
10
如果我理解正确,我认为最好的方法是使用窗口函数:
SELECT p.Id, p.Score p.body
FROM (SELECT p.*,
MAX(p.tags) OVER (PARTITION BY COALESCE(p.parentid, p.id)) as tags
FROM `sotorrent-org.2018_09_23.Posts` p
)
WHERE p.Tags LIKE '%android%' AND
p.PostTypeId = 2
LIMIT 10;
这应该更快。效果很好!非常感谢。仅供参考:这不会是成本的一半!相同的字节不会计数两次,三次等:o)因此它将与第一次相同answer@MikhailBerlyant . . . BQ不计算对表的每个引用?按成本计算-您可以多次自联接表,并且只计算该表大小的成本