重複しない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'
)
これを行うためのより良い方法があるかもしれません-私もそれを見たいと思います!私が考えることができる1つの方法は、外部結合を使用することです。 (データがどのように構造化されているか正確にはわからないので、不自然な例を許してください。ただし、問題なく翻訳されることを願っています。)これはどうですか?
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;
お役に立てれば!
外部結合を使用できます。
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
条件は常に真になるため、NULL
値を返す可能性のあるサブクエリにNOT IN
を使用する場合も、注意が必要です。クエリはa.first_party_id
をNULL
と比較していますが、これは常にfalseになるため、NOT IN
は条件が常にtrueになります。厄介な小さな落とし穴。
これを回避する1つの方法は、NOT IN
の使用を回避するか、サブクエリに条件を追加することです(例:AND third_party_id IS NOT NULL
)。
詳細な説明については、 ここ を参照してください。