SQL - 每人随机选择一条记录

时间:2017-06-29 19:12:28

标签: mysql sql transactions

我目前有一个表格,其中包含100人与交易中每个产品的第一笔交易的详细信息,作为单独的记录。有些人在第一次交易中只购买了1种产品,而其他人在第一次交易中可能购买了多达4种不同的产品。

我想创建一个包含每人1个不同记录的表格,如果他们在第一笔交易中购买了多个不同的产品,我会随机选择其中一个产品。我将如何在mySQL中执行此操作?

1 个答案:

答案 0 :(得分:1)

假设你的表是这样的:

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

它可能还有其他专栏,但我不会猜测它们。

我会这样做"洗牌"每个人的行。首先按人排序表,然后随机化给定人员的行。您可以使用ORDER BY person_id, RAND()

执行此操作

然后为每个人选择第一行。这是一种方法,使用MySQL会话变量来跟踪行号并从每个不同的person_id开始行编号:

SELECT person_id, product_id, transaction_date
FROM (
    SELECT IF(@p=person_id, @r:=@r+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;

P.S。:顺便说一句,当您提出有关SQL的问题时,您应该运行SHOW CREATE TABLE MyTable并将结果包含在您的问题中。它可以帮助人们不必猜测你的表,列,索引,数据类型等。他们可以编写一个更接近你需要的例子。