式でCOUNT()を複数回使用してOVERを実装するにはどうすればよいですか?

user8629729

LeetCodeの問題を解決するために書いているクエリについて質問がありますここに問題があります:

広告

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| ad_id         | int     |
| user_id       | int     |
| action        | enum    |
+---------------+---------+

(ad_id、user_id)は、このテーブルの主キーです。

このテーブルの各行には、広告のID、ユーザーのID、およびこの広告に関してこのユーザーが実行したアクションが含まれています。アクション列は、(「クリック」、「表示」、「無視」)の列挙型です。

会社が広告を実行していて、各広告のパフォーマンスを計算したいと考えています。

広告のパフォーマンスは、クリックスルー率(CTR)を使用して測定されます。

CTR = {0広告クリックがない場合、広告クリック/(広告クリック+広告ビュー)それ以外の場合

各広告のクリック率を見つけるためのSQLクエリを記述します。

クリック率を小数点以下2桁に丸めます。同点の場合は、結果テーブルをctrで降順で、ad_idで昇順で並べ替えます。

クエリ結果の形式は次の例です。

広告テーブル:

+-------+---------+---------+
| ad_id | user_id | action  |
+-------+---------+---------+
| 1     | 1       | Clicked |
| 2     | 2       | Clicked |
| 3     | 3       | Viewed  |
| 5     | 5       | Ignored |
| 1     | 7       | Ignored |
| 2     | 7       | Viewed  |
| 3     | 5       | Clicked |
| 1     | 4       | Viewed  |
| 2     | 11      | Viewed  |
| 1     | 2       | Clicked |
+-------+---------+---------+

これがサンプルデータと私の試みた解決策のフィドルです。以下に再現された解決策の試み:

SELECT DISTINCT t.ad_id, ROUND(
    IF(
        COUNT(c.ad_id) OVER (PARTITION BY t.ad_id) = 0, 
        0,
      COUNT(c.ad_id) OVER (PARTITION BY t.ad_id) * 100 / ( COUNT(c.ad_id) OVER (PARTITION BY t.ad_id) + COUNT(v.ad_id) OVER (PARTITION BY t.ad_id) )
    ), 2) as ctr
FROM Ads as t
LEFT JOIN Ads as c ON c.ad_id=t.ad_id AND c.user_id=t.user_id AND c.action='Clicked'
LEFT JOIN Ads as v ON v.ad_id=t.ad_id AND v.user_id=t.user_id AND v.action='Viewed'
GROUP BY t.ad_id, c.ad_id, v.ad_id
ORDER BY ctr DESC, t.ad_id

このクエリの結果:

ad_id   ctr
1   50.00
2   50.00
3   50.00
5   0.00

正しい結果は次のようになります。

ad_id ctr
1, 66.67
3, 50.00
2, 33.33
5, 0.00

サンプルデータを見ると、COUNT()は実際にはt.ad_idによるパーティション分割ではないと思います。50%のCT​​Rの結果は、計算ですべての「クリック」インスタンスとすべての「表示」インスタンスをカウントするCTR計算によって説明できます。(一方、CTR計算内のOVERステートメント(条件ではなく計算だけ)を削除しても、私の仮説が示唆するように、上記の結果は生成されません。したがって、これについてはよくわかりません。)

OVERの使い方に問題はありますか?私の論理はここに欠陥がありますか?

また、ボーナスの質問があります。JOINはサブクエリを使用するよりも高速であると想定しているため、ここではJOINを使用することを選択しています。これは公正な仮定ですか?私はデータアナリスト1のインタビューのために勉強しています-私がJOINとサブクエリを使用してもインタビュアーは気にかけると思いますか?

編集:forpasの説明のおかげで、私はオリジナルよりもはるかに簡単な解決策を思いつくことができました。以下の彼の回答にあるforpasの解決策は、テーブル内のNULLを明示的に処理するため、依然として望ましいと思います。

SELECT ad_id, ROUND(IF(
    SUM(action='Clicked') = 0,
    0,
    SUM(action='Clicked') * 100 / ( SUM(action='Clicked') + SUM(action='Viewed'))
), 2) as ctr
FROM Ads
GROUP BY ad_id
ORDER BY ctr DESC, ad_id
逝去

条件付き集計でそれを行うことができます:

SELECT ad_id,
  ROUND(100 * COALESCE(SUM(action = 'Clicked') / SUM(action IN ('Clicked', 'Viewed')), 0), 2) ctr
FROM Ads
GROUP BY ad_id
ORDER BY ctr DESC, ad_id;

SUM()ウィンドウ関数でも同じ結果が得られる可能性がありますが、パフォーマンスや読みやすさの点でこれが優れているとは思いません。

SELECT DISTINCT ad_id,
  ROUND(
    100 * 
    COALESCE(
      SUM(action = 'Clicked') OVER (PARTITION BY ad_id) / 
      SUM(action IN ('Clicked', 'Viewed')) OVER (PARTITION BY ad_id)
      , 0
    )
    , 2
  ) ctr
FROM Ads
ORDER BY ctr DESC, ad_id;

デモをご覧ください
結果:

> ad_id |   ctr
> ----: | ----:
>     1 | 66.67
>     3 | 50.00
>     2 | 33.33
>     5 |  0.00

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

分類Dev

クエリを複数回実行しないようにするにはどうすればよいですか?

分類Dev

INSERT INTOを使用して複数回挿入を選択するにはどうすればよいですか?

分類Dev

printfを使用して文字を複数回印刷するにはどうすればよいですか?

分類Dev

jquery を使用して div に複数回追加するにはどうすればよいですか?

分類Dev

react-native-image-crop-pickerを使用して複数回写真を撮るにはどうすればよいですか?

分類Dev

Vitamio VideoViewを複数回使用するにはどうすればよいですか?

分類Dev

C ++を使用してmatlabでuniqueの動作を実装するにはどうすればよいですか?

分類Dev

Kotlinでnull可能な「beanName」を使用してBeanPostProcessorを実装するにはどうすればよいですか?

分類Dev

Cで連分数を使用して自然対数を実装するにはどうすればよいですか?

分類Dev

AndroidでSpinnerを使用して検索を実装するにはどうすればよいですか?

分類Dev

KotlinでFirebaseを使用して電話認証を実装するにはどうすればよいですか?

分類Dev

RustでWindowsIOCPを使用して非同期関数を実装するにはどうすればよいですか?

分類Dev

引数を使用してLuaでrfindを実装するにはどうすればよいですか?

分類Dev

JavaでHashMapを使用してスタックを実装するにはどうすればよいですか?

分類Dev

ajaxを使用してDjangoで編集を実装するにはどうすればよいですか?

分類Dev

C#でopenclを使用して行列乗算を実装するにはどうすればよいですか?

分類Dev

QPainter + QPixmapを使用してマウスで描画を実装するにはどうすればよいですか?

分類Dev

Vue.jsを使用してこれを実装するにはどうすればよいですか?

分類Dev

kthreadsを使用して補完を適切に実装するにはどうすればよいですか?

分類Dev

`splitAt`を使用してVecに` rotate`関数を実装するにはどうすればよいですか?

分類Dev

Expressを使用してnodeJSに管理パネルを実装するにはどうすればよいですか?

分類Dev

Javaを使用して特定のUMLを厳密に実装するにはどうすればよいですか?

分類Dev

Volleyを使用してAndroidにログインを実装するにはどうすればよいですか?

分類Dev

JavaScript を使用して Div 内に Div を実装するにはどうすればよいですか?

分類Dev

使用しているPython実装を確認するにはどうすればよいですか?

分類Dev

使用しているPython実装を確認するにはどうすればよいですか?

分類Dev

KotlinでGROUPBYを使用してCOUNT(*)を実行するにはどうすればよいですか?

分類Dev

rxJavaを使用して一連の連続操作を実装するにはどうすればよいですか?

Related 関連記事

  1. 1

    複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

  2. 2

    クエリを複数回実行しないようにするにはどうすればよいですか?

  3. 3

    INSERT INTOを使用して複数回挿入を選択するにはどうすればよいですか?

  4. 4

    printfを使用して文字を複数回印刷するにはどうすればよいですか?

  5. 5

    jquery を使用して div に複数回追加するにはどうすればよいですか?

  6. 6

    react-native-image-crop-pickerを使用して複数回写真を撮るにはどうすればよいですか?

  7. 7

    Vitamio VideoViewを複数回使用するにはどうすればよいですか?

  8. 8

    C ++を使用してmatlabでuniqueの動作を実装するにはどうすればよいですか?

  9. 9

    Kotlinでnull可能な「beanName」を使用してBeanPostProcessorを実装するにはどうすればよいですか?

  10. 10

    Cで連分数を使用して自然対数を実装するにはどうすればよいですか?

  11. 11

    AndroidでSpinnerを使用して検索を実装するにはどうすればよいですか?

  12. 12

    KotlinでFirebaseを使用して電話認証を実装するにはどうすればよいですか?

  13. 13

    RustでWindowsIOCPを使用して非同期関数を実装するにはどうすればよいですか?

  14. 14

    引数を使用してLuaでrfindを実装するにはどうすればよいですか?

  15. 15

    JavaでHashMapを使用してスタックを実装するにはどうすればよいですか?

  16. 16

    ajaxを使用してDjangoで編集を実装するにはどうすればよいですか?

  17. 17

    C#でopenclを使用して行列乗算を実装するにはどうすればよいですか?

  18. 18

    QPainter + QPixmapを使用してマウスで描画を実装するにはどうすればよいですか?

  19. 19

    Vue.jsを使用してこれを実装するにはどうすればよいですか?

  20. 20

    kthreadsを使用して補完を適切に実装するにはどうすればよいですか?

  21. 21

    `splitAt`を使用してVecに` rotate`関数を実装するにはどうすればよいですか?

  22. 22

    Expressを使用してnodeJSに管理パネルを実装するにはどうすればよいですか?

  23. 23

    Javaを使用して特定のUMLを厳密に実装するにはどうすればよいですか?

  24. 24

    Volleyを使用してAndroidにログインを実装するにはどうすればよいですか?

  25. 25

    JavaScript を使用して Div 内に Div を実装するにはどうすればよいですか?

  26. 26

    使用しているPython実装を確認するにはどうすればよいですか?

  27. 27

    使用しているPython実装を確認するにはどうすればよいですか?

  28. 28

    KotlinでGROUPBYを使用してCOUNT(*)を実行するにはどうすればよいですか?

  29. 29

    rxJavaを使用して一連の連続操作を実装するにはどうすればよいですか?

ホットタグ

アーカイブ