如何从列中的多条记录中仅选择 3 条记录?

Posted

技术标签:

【中文标题】如何从列中的多条记录中仅选择 3 条记录?【英文标题】:How to select only 3 records from multiple records in column? 【发布时间】:2020-12-02 07:55:08 【问题描述】:

我有一个包含 3 列的表(ID、CARDNO、CONTACTNO)

每个cardno有多个contactno

ID    CARDNO          CONTACTNO
1     1234567895412   32225465987
2     1234567895412   65554789654
3     1234567895412   24445698741
4     1234567895412   24445698745
5     1234567895412   45556987123

我只想针对 1 张卡选择 3 个随机联系人编号

【问题讨论】:

你真的想要随机还是随意? 【参考方案1】:

嗯,你有几个选择,但我认为最简单的一个是:

SELECT *
  FROM contact_data  -- your table name
 ORDER BY dbms_random.random
 FETCH FIRST 3 ROWS ONLY;

【讨论】:

【参考方案2】:

可以使用ROW_NUMBER解析函数如下:

SELECT ID, CARDNO, CONTACTNO FROM
(SELECT ID, CARDNO, CONTACTNO, 
       ROW_NUMBER() OVER (PARTITION BY CARDNO ORDER BY 1) AS RN
FROM YOUR_TABLE)
WHERE RN <= 3;

如果您确实需要随机性,则可以在ROW_NUMBEROVER 子句中将ORDER BY 1 替换为ORDER BY dbms_random.value(0,1)

【讨论】:

这是有效的。现在我正在尝试用这个表加入另外 2 个表。你能帮我吗? 请分享详细信息。样本数据预期输出和表详细信息【参考方案3】:

也许你可以试试这样的东西

SELECT * FROM TABLE WHERE CARDNO = '1234567895412' ORDER BY RAND() LIMIT 3;

用你的表名替换 TABLE,

【讨论】:

【参考方案4】:

如果你真的想要随机,那么使用row_number()dbms_random 函数:

select t.*
from (select t.*,
             row_number() over (partition by cardno order by dbms_random.value) as seqnum
      from t
     ) t
where seqnum <= 3;

不过,通俗地说,人们经常使用“随机”,但不是技术意义上的。如果是这种情况,您可以将 order by 替换为任何有意义的内容 - 包括完全删除它。

【讨论】:

以上是关于如何从列中的多条记录中仅选择 3 条记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

SQL 查询将多条记录中的值组合到单个列中

如何从左表中仅获取一条记录与右表中的每条记录

如何将多条记录中的有序数据返回到 MySQL 中的一条记录中?

如何从mysql中的表中选择N条记录

如何在表单中仅显示 1 条记录?