2017-06-29 8 views
2

私は現在、トランザクション内の各製品の最初の100人のトランザクションの詳細を別のレコードとして含む1つのテーブルを持っています。最初のトランザクションで1つの製品しか購入しなかった人もいれば、最初のトランザクションで4つの異なる製品を購入した人もいます。SQL - 一人一レコードランダムに選択してください

1人あたり1つの異なるレコードを含むテーブルを作成したいと思います。最初のトランザクションで複数の異なる製品を購入した場合、それらの製品の1つをランダムに選択しています。これをmySQLでどうやってやりますか?

CREATE TABLE MyTable (
    person_id INT, 
    product_id INT, 
    transaction_date DATE 
); 

それはあまりにも他の列があるかもしれませんが、私はそれらを推測するつもりはない:

+3

どのように "ランダム"、どのsql? 'sql-server'は通常、MySQLと同じではないMS SQL Serverを示します。 – Uueerdo

+0

答えは、使用しているDBMSの答えに大きく依存します。データベースの世界では、顧客の購入をトランザクションと混同しないでください。これらは非常に異なるものです。 –

+1

データスキーマに関する詳細情報も提供する必要があります。これらのレコードは1つのテーブルにありますか?主キーはありますか?あなたの目標を達成するために、サブクエリを使ってクエリを書く必要があるかもしれません。 – htm11h

答えて

1

は、あなたの表は、このようなものですと仮定します。

これは、各人物の行を「シャッフル」することで行います。最初に人によってテーブルをソートし、その人の行をランダム化します。 ORDER BY person_id, RAND()を使用してこれを行うことができます。

次に、各人物の最初の行を選択します。これは、行番号を追跡し、各個別のPERSON_IDで1から行番号を開始するには、MySQLのセッション変数を使用して、これを行う方法です:MySQLの8.0は、(おそらく2018年)出てくるとき

SELECT person_id, product_id, transaction_date 
FROM (
    SELECT IF(@p=person_id, @r:[email protected]+1, 1) AS row_num 
     @p:=person_id AS person_id, product_id, transaction_date 
    FROM (SELECT @p:=0, @r:=0) AS _init 
    CROSS JOIN MyTable 
    ORDER BY person_id, RAND() 
) AS T 
WHERE row_num = 1; 

、それが実装する必要があります

SELECT person_id, product_id, transaction_date 
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY RAND()) AS row_num, 
     person_id, product_id, transaction_date 
    FROM MyTable 
) AS T 
WHERE row_num = 1; 

PS:あなたはSQLについての質問をしたときにところで、あなたはSHOW CREATE TABLE MyTableを実行して、あなたの質問に結果が含まれている必要があり、このもう少し標準になりますウィンドウ機能、。これは、人々があなたのテーブル、カラム、インデックス、データタイプなどを推測する必要がなくなり、必要なものに近い例を書くことができるようになります。

+0

ありがとう!これは私の質問に正確に答えました。私は将来の質問についてもあなたのヒントを心に留めておきます - ありがとうございました! –

関連する問題