如何从列中的多条记录中仅选择 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_NUMBER
的OVER
子句中将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 的多个值?