2017-01-10 82 views
2

我正在使用Google BigQuery,我試圖找到從'table2'的用戶標識符,不包括存儲在'table1'中的用戶標識符2次或更多次。 這是代碼:不在谷歌工作BigQuery標準sql

#standardSQL 
WITH t100 AS (
SELECT count_table.userid 
From(
SELECT userid,COUNT(`project.dataset.table1`.userid) as notification_count 
FROM `project.dataset.table1` 
GROUP BY userid) as count_table 
where notification_count >= 2 
) 

SELECT userid FROM `project.dataset.table2` WHERE userid NOT IN (SELECT userid FROM t100) 

的問題是,這是返回「用戶ID從的‘被儲存的2倍以上表1’,我已經嘗試添加WHERE userid IS NOT NULLSELECT userid FROM t100,但它使沒有不同。 ,並且只是爲了讓所有內容更清晰,這個: SELECT userid FROM t100,不是空的,並且由於某種原因返回的結果仍顯示在上面的第一個代碼的結果中。

回答

2

我曾嘗試加入其中userid IS NOT NULL的SELECT用戶ID FROM T100,但它並沒有區別

當然,這並沒有影響,因爲當你做COUNT(userid) as notification_count它總是返回0爲userid NULL因此被過濾出HAVING notification_count >= 2
如果您將使用COUNT(1),而不是 - 您可能會在t100的輸出中獲得空userids。所以userid is NULL是definitelly這裏

正如有人指出不是一個問題 - 你的查詢應該工作 - 所以,如果你繼續讓問題 - 你需要在這個問題上挖掘更多,它爲我們提供更多的細節

與此同時下面嘗試爲您的(否則看起來不錯)查詢

#standardSQL 
WITH t100 AS (
    SELECT userid 
    FROM `project.dataset.table1` 
    GROUP BY userid 
    HAVING COUNT(userid) >= 2 
) 
SELECT userid 
FROM `project.dataset.table2` AS t2 
LEFT join t100 ON t100.userid = t2.userid 
WHERE t100.userid IS NULL 
+0

這工作,我不知道爲什麼我的查詢不起作用或爲什麼查詢其他答案包括沒有工作。但是謝謝。 –

1

不知道爲什麼這不起作用,但出於一般原則,我從不將(not) in與select語句組合使用。相反,我會left outer join子查詢和篩選其中的空值:

#standardSQL 

with t100 as (
select 
    count_table.userid 

from(
select 
    userid 
    ,count(`project.dataset.table1`.userid) as notification_count 

from `project.dataset.table1` 

group by 
    userid 
) as count_table 

where notification_count >= 2 
) 

select 
    t2.userid as userid 

from `project.dataset.table2` t2 
left outer join t100 
    on t100.userid = t2.userid 

where t100.userid is null 
0

這是由於空處理。在我們的issue tracker上有一個類似的帖子,關於NOT INNOT EXISTS。該documentation for IN狀態:

與在IN-list中的NULL只能返回TRUE或NULL,決不會爲假

爲了達到你想要的語義,你應該使用防半連接(NOT EXISTS )。例如,

#standardSQL 
WITH t100 AS (
    SELECT 
    userid, 
    COUNT(userid) as notification_count 
    FROM `project.dataset.table1` 
    GROUP BY userid 
    HAVING notification_count >= 2 
) 
SELECT userid 
FROM `project.dataset.table2` AS t2 
WHERE NOT EXISTS (SELECT 1 FROM t100 WHERE userid = t2.userid); 
+0

這是我第一個想到的另一個版本,但OP指出:「我曾試圖加入'WHERE的userid沒有NULL'到'SELECT用戶ID FROM t100',但它沒有任何區別「 – oulenz

+0

其他的東西在該版本的查詢中是不正確的e是一個錯誤,這似乎不太可能。 –

+0

你可以檢查Mikhail Berlyant的答案,它出於某種原因,既不是我的原始查詢也不是你的答案或第一個工作,謝謝。 –