のは、より明白なものの一部で開始し、我々は他の情報を収集するために始めることができるかどうか見てみましょう。
次に、外部クエリのGROUP BY 1
はGROUP BY partner_id
である必要があります。
次はあなたのINNER
クエリでorder by
を必要としない、それはそうORDER BY id
を削除せずに、データベースエンジンは、おそらくパフォーマンスを最適化し、より良い仕事を行います。
最終結果を注文する場合は、OUTER
クエリのグループ番号の後にORDER BY partner_id
または類似の句を追加します。
どのようにあなたがpartnerids
からpartnerid
を分割しているが、私はあなたのビューと、それはそれはpartnerid
のためにあなたのレコード数にどのように影響するかを知るために提供するデータを理解する必要があるので、私はそれについて肯定的ではないよとの問題もあるように見えます。私はあなたにもあるため2
が1
よりgreater
であることを満足させる第一の条件としてs.i = 1
をオフにドロップすることができますかなり確信しているutil.seq_0_to_500
上ごLEFT JOIN
文次へ
。しかし、left join
は実際にinner join
のように機能します。その場合、positron_articles
にはs.i > 0
を含まない一致を除外するためです。
奇妙なことに、あなたの全体の参加とinner
クエリは種類のあなただけの彼らのpartnerids
にはコンマを持っていない記事にしたいために廃棄されます:regexp_count (partner_ids,',') = 0
は、私はあなたのutil.seq_0_to_500
のコードを投稿お勧めします、あなたはpartner table
レットを使用している場合regexp_countの動作の仕方によっては、おそらくその追加のテーブルで簡単に答えを出すことができるからです。私は疑問だregex_count(partnerids,partnerid)
例regex_count('12345,678',1234)
は、0
よりもgreater
を返します。新しいマッチング関数を数えたり構築する前に、区切られた文字列を別のテーブルに分割するしかありません。
regex_countはカンマの間の正確な一致すると、あなたのクエリは、このように簡単かもしれないパートナーテーブルを持っている場合:
SELECT
p.partner_id
,COUNT(a.id) AS ArticlesAppearedIn
FROM
positron_articles a
LEFT JOIN PARTNERTABLE p
ON regexp_count(a.partnerids,p.partnerid) > 0
GROUP BY
p.partner_id
私はパートナーのテーブルを結合する方法を考えて、私は実際に自分自身を修正しますregexp_count
なし。あなたがパートナーテーブルを持っているなら、これはあなたのために働くかもしれません。そうでない場合は、文字列を分割する必要があります。基本的にはpartnerid
がpartnerids
の全部であるか、最初、中部、またはpartnerids
の最後であるかどうかを調べる。これらのうちの1つが満たされると、レコードが返されます。
SELECT
p.partner_id
,COUNT(a.id) AS ArticlesAppearedIn
FROM
PARTNERTABLE p
INNER JOIN positron_articles a
ON
(
CASE
WHEN a.partnerids = CAST(p.partnerid AS VARCHAR(100)) THEN 1
WHEN a.partnerids LIKE p.partnerid + ',%' THEN 1
WHEN a.partnerids LIKE '%,' + p.partnerid + ',%' THEN 1
WHEN a.partnerids LIKE '%,' + p.partnerid THEN 1
ELSE 0
END
) = 1
GROUP BY
p.partner_id
「partner_ids」は値のカンマ区切りリストですか? –
正しいBozhidarが、下の私のコメントを見て、問題は上記のスクリプトではなく、データをredshiftにエクスポートするアプリではなかったように見えます。 –