ここから本文です

「ある集団Aに似た、集団Bを抽出する」 クエリの書き方を知りたいと思っています...

アバター

ID非公開さん

2017/8/1010:00:06

「ある集団Aに似た、集団Bを抽出する」
クエリの書き方を知りたいと思っています。


以下のようなテーブルがあるとして、

----------------------------------------------
ランキング

(購入金額降順),属性,ユーザーID
1,B,11
2,A,22
3,A,33
3,B,44
4,A,55
4,B,66
5,B,77
5,B,88
6,B,99



----------------------------------------------

「属性Aの集団に似た分布で、属性Bの中からサンプリング」したいのです。
※似る=ランキングが近い、で考えております

今回でいえば、
1,B,11
3,B,44
4,B,66
の3件のBが抽出されるようなイメージです。

属性Aの合計人数より、
抽出したBの数が少なくても構いませんので、
属性Aとできるだけ同じ分布でBを抽出できればと思っております。

そもそもユーザーごとにランキングをつけずに、
違う方法がございましたらご指南いただきたいです。

なにとぞよろしくお願いいたします。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
52
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tumura999さん

2017/8/1015:07:43

(Bのランキング-Aのランキング)の絶対値が小さいものを抽出すればいいでしょう。

ちょっとわかりやすく、データ量を減らして書きますね。
1,B,11
2,A,22
3,A,33
3,B,44
SELECT B.ランキング,B.属性,B.ユーザーID,ABS(B.ランキング-A.ランキング)
FROM テーブル B,テーブルA
WHERE A.属性='A' AND B.属性='B'
このSQLの結果は
1,B,11,ABS(1-2)=1
1,B,11,ABS(1-3)=2
3,B,44,ABS(3-2)=1
3,B,44,ABS(3-3)=0
となります。
この中から、ランキングの差の小さいBを選択してみます。
SELECT ランキング,属性,ユーザーID,B.ランキング,MIN(ランキング差)
FROM (
SELECT B.ランキング,B.属性,B.ユーザーID,B.ランキング,ABS(B.ランキング-A.ランキング) as ランキング差
FROM テーブル B,テーブルA
WHERE A.属性='A' AND B.属性='B'
) X
GROUP BY ランキング,ユーザーID
;
この結果は
1,B,11,1
3,B,44,0
となります。
これにORDER BY MIN(ランキング差)をかけると
3,B,44,0
1,B,11,1
となりますので、LIMIT文で出力する数を属性がAの数のものにすれば得たい結果が得られるでしょう。

SELECT ランキング,属性,ユーザーID,B.ランキング
FROM (
SELECT B.ランキング,B.属性,B.ユーザーID,B.ランキング,ABS(B.ランキング-A.ランキング) as ランキング差
FROM テーブル B,テーブルA
WHERE A.属性='A' AND B.属性='B'
) X
GROUP BY ランキング,ユーザーID
ORDER BY MIN(ランキング差)
LIMIT (SELECT COUNT(*) FROM テーブル WHERE 属性='A')
;

  • アバター

    質問者

    ID非公開さん

    2017/8/1019:15:30

    ご回答ありがとうございます。

    質問でございますが、
    例えば以下のようなデータの場合、

    1,B,11
    2,A,22
    3,A,33
    3,B,44
    3,B,55
    3,B,66
    4,B,77
    5,B,88
    6,A,99

    ランキング差がゼロになる、
    3位タイのBから3件が抽出される結果になり、
    Aの分布とは少し違う集団になってしまうかと思っております。

    認識に誤りがありましたら申し訳ございません。
    どうぞよろしくお願いいたします。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。