2016-06-17 3 views
0

こんにちは私は、多くのアカウントを含むことができるフィールドを持つ記事の赤方偏移表を持っています。だから、アカウントと記事の間には1対1の関係があります。テーブルのSQL regexpでIDが何回発生したか

しかし、パートナーIDが1つの列に表示され、別の列にパートナーIDがアーティクル表に表示される回数が表示される新しいビューを作成したいとします。

私はregexを使ってこれを行おうとしましたが、新しい赤方偏移ビューを作成しましたが、常に正しく構築されないという奇妙な結果を得ています。したがって、ある日パートナーは15回、次に17回、次にパートナーのIDカウントが実際には変更されていない15回、と表示されます。

ご協力いただければ幸いです。

SELECT partner_id, 
 
     COUNT(DISTINCT id) 
 
FROM (SELECT id, 
 
      partner_ids, 
 
      SPLIT_PART(partner_ids,',',i) partner_id 
 
     FROM positron_articles a 
 
     LEFT JOIN util.seq_0_to_500 s 
 
       ON s.i < regexp_count (partner_ids,',') + 2 
 
       OR s.i = 1 
 
     WHERE i > 0 
 
     AND regexp_count (partner_ids,',') = 0 
 
     ORDER BY id) 
 
GROUP BY 1;

+0

「partner_ids」は値のカンマ区切りリストですか? –

+0

正しいBozhidarが、下の私のコメントを見て、問題は上記のスクリプトではなく、データをredshiftにエクスポートするアプリではなかったように見えます。 –

答えて

0

のは、より明白なものの一部で開始し、我々は他の情報を収集するために始めることができるかどうか見てみましょう。

次に、外部クエリのGROUP BY 1GROUP BY partner_idである必要があります。

次はあなたのINNERクエリでorder byを必要としない、それはそうORDER BY idを削除せずに、データベースエンジンは、おそらくパフォーマンスを最適化し、より良い仕事を行います。

最終結果を注文する場合は、OUTERクエリのグループ番号の後にORDER BY partner_idまたは類似の句を追加します。

どのようにあなたがpartneridsからpartneridを分割しているが、私はあなたのビューと、それはそれはpartneridのためにあなたのレコード数にどのように影響するかを知るために提供するデータを理解する必要があるので、私はそれについて肯定的ではないよとの問題もあるように見えます。私はあなたにもあるため21より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なし。あなたがパートナーテーブルを持っているなら、これはあなたのために働くかもしれません。そうでない場合は、文字列を分割する必要があります。基本的にはpartneridpartneridsの全部であるか、最初、中部、または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 
+0

実際には問題はクエリではなく、データエクスポートアプリであるように見えます。しかし、あなたのコメントは、正規表現を理解する上で非常に役立ったので、ありがとう! –

関連する問題