2017-06-29 72 views
2

我目前有一張表,其中包含100個人的第一筆交易的細節,作爲單獨記錄與交易中的每個產品進行比較。有些人在第一筆交易中只購買了1件產品,而其他人在第一筆交易中購買了4件不同的產品。SQL - 每個人隨機選擇一條記錄

我想創建一個包含每個人1個不同記錄的表,如果他們在第一個交易中購買了多個不同的產品,我隨機選擇其中一個產品。我將如何去在mySQL中做這件事?

+3

如何「隨機」,以及哪個sql? 'sql-server'通常表示MS SQL Server,它與MySQL不一樣。 – Uueerdo

+0

答案很大程度上取決於您對所使用的DBMS的答案。而在數據庫世界中,不要將顧客的購買和交易混淆起來,它們是完全不同的東西。 –

+1

您還需要提供有關數據模式的更多信息。這些記錄是否在一張桌子上?有主鍵嗎?您可能需要使用子查詢編寫查詢來實現您的目標。 – htm11h

回答

1

假設你的表是這樣的:

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

它可能有其他列過,但我不打算在他們猜測。

我會通過「混洗」每個人的行來做到這一點。先按人排序,然後隨機化給定人的行。您可以使用ORDER BY person_id, RAND()來完成此操作。

然後爲每個人選擇第一行。這是一個辦法做到這一點,使用MySQL會話變量跟蹤行號,並開始該行從1開始編號,每個不同的爲person_id:

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; 

當MySQL 8.0出來(可能在2018年),它應該實現窗口的功能,這將使這多一點的標準:

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

謝謝!這完全回答了我的問題。我會在未來的問題中留意您的提示 - 非常感謝您! –