我目前有一張表,其中包含100個人的第一筆交易的細節,作爲單獨記錄與交易中的每個產品進行比較。有些人在第一筆交易中只購買了1件產品,而其他人在第一筆交易中購買了4件不同的產品。SQL - 每個人隨機選擇一條記錄
我想創建一個包含每個人1個不同記錄的表,如果他們在第一個交易中購買了多個不同的產品,我隨機選擇其中一個產品。我將如何去在mySQL中做這件事?
我目前有一張表,其中包含100個人的第一筆交易的細節,作爲單獨記錄與交易中的每個產品進行比較。有些人在第一筆交易中只購買了1件產品,而其他人在第一筆交易中購買了4件不同的產品。SQL - 每個人隨機選擇一條記錄
我想創建一個包含每個人1個不同記錄的表,如果他們在第一個交易中購買了多個不同的產品,我隨機選擇其中一個產品。我將如何去在mySQL中做這件事?
假設你的表是這樣的:
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
和結果包含在你的問題。它可以幫助人們不必猜測你的表,列,索引,數據類型等等。他們可以寫出一個更接近你需要的例子。
謝謝!這完全回答了我的問題。我會在未來的問題中留意您的提示 - 非常感謝您! –
如何「隨機」,以及哪個sql? 'sql-server'通常表示MS SQL Server,它與MySQL不一樣。 – Uueerdo
答案很大程度上取決於您對所使用的DBMS的答案。而在數據庫世界中,不要將顧客的購買和交易混淆起來,它們是完全不同的東西。 –
您還需要提供有關數據模式的更多信息。這些記錄是否在一張桌子上?有主鍵嗎?您可能需要使用子查詢編寫查詢來實現您的目標。 – htm11h