我正在运行一个查询,该查询提供了一组非重叠的first_party_id&id,它们与一个第三方相关联,但与另一个第三方相关联。但是,此查询不在Athena中运行,而是出现错误:Correlated queries not yet supported.
正在查看prestodb文档,https://prestodb.io/docs/current/sql/select.html(Athena是引擎盖下的prestodb),用于替代嵌套查询。给出的with statement
示例似乎没有很好地转换为此not in
子句。想知道嵌套查询的替代方法是什么 - 在下面查询。
SELECT
COUNT(DISTINCT i.third_party_id) AS uniques
FROM
db.ids i
WHERE
i.third_party_type = 'cookie_1'
AND i.first_party_id NOT IN (
SELECT
i.first_party_id
WHERE
i.third_party_id = 'cookie_2'
)
答案 0 :(得分:7)
可能有更好的方法来做到这一点 - 我很想看到它!我能想到的一种方法是使用外连接。 (我不确定你的数据是如何构建的,所以请原谅这个人为的例子,但我希望它可以翻译好。)这个怎么样?
with
a as (select *
from (values
(1,'cookie_n',10,'cookie_2'),
(2,'cookie_n',11,'cookie_1'),
(3,'cookie_m',12,'cookie_1'),
(4,'cookie_m',12,'cookie_1'),
(5,'cookie_q',13,'cookie_1'),
(6,'cookie_n',13,'cookie_1'),
(7,'cookie_m',14,'cookie_3')
) as db_ids(first_party_id, first_party_type, third_party_id, third_party_type)
),
b as (select first_party_type
from a where third_party_type = 'cookie_2'),
c as (select a.third_party_id, b.first_party_type as exclude_first_party_type
from a left join b on a.first_party_type = b.first_party_type
where a.third_party_type = 'cookie_1')
select count(distinct third_party_id) from c
where exclude_first_party_type is null;
希望这有帮助!
答案 1 :(得分:0)
您可以使用外部联接:
SELECT
COUNT(DISTINCT i.third_party_id) AS uniques
FROM
db.ids a
LEFT JOIN
db.ids b
ON a.first_party_id = b.first_party_id
AND b.third_party_id = 'cookie_2'
WHERE
a.third_party_type = 'cookie_1'
AND b.third_party_id is null -- this line means we select only rows where there is no match
在将NOT IN
用于可能返回NULL
值的子查询时,您也应该小心,因为条件将始终为true。您的查询正在将a.first_party_id
与NULL
进行比较,这将始终为false,因此NOT IN
将导致条件始终为true。讨厌的小陷阱。
避免这种情况的一种方法是避免使用NOT IN
或向子查询中添加条件,即AND third_party_id IS NOT NULL
。
有关详细说明,请参见here。