Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 SOTorrent:只选择那些带有;安卓;标签?_Sql_Google Bigquery - Fatal编程技术网

Sql SOTorrent:只选择那些带有;安卓;标签?

Sql SOTorrent:只选择那些带有;安卓;标签?,sql,google-bigquery,Sql,Google Bigquery,数据集:——这是数据集(托管在Google的BigQuery上):您可以在那里运行查询,然后再运行。它有一个Posts表。虽然我已经尝试解释了下面的相关字段,但是可以在这里找到Posts表的详细模式供您参考: 所以:堆栈溢出 背景:数据集有一个名为Posts的表。在该表中,存在一个字段PostTypeId: 如果该字段为1,则表示我们现在查看的帖子是发布在SO上的问题。在这种情况下,另一个名为Tags的字段将包含由SO上问题的OP分配的标签 如果该字段为2,则它是发布在SO上的答案。在这种情况

数据集:——这是数据集(托管在Google的BigQuery上):您可以在那里运行查询,然后再运行。它有一个Posts表。虽然我已经尝试解释了下面的相关字段,但是可以在这里找到Posts表的详细模式供您参考:

所以:堆栈溢出

背景:数据集有一个名为Posts的表。在该表中,存在一个字段PostTypeId

  • 如果该字段为1,则表示我们现在查看的帖子是发布在SO上的问题。在这种情况下,另一个名为Tags的字段将包含由SO上问题的OP分配的标签

  • 如果该字段为2,则它是发布在SO上的答案。在这种情况下,标记字段将为空

问题:只选择那些附加了Android标签的线程的所有答案

我的解决方案:

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不计算对表的每个引用?按成本计算-您可以多次自联接表,并且只计算该表大小的成本