【问题标题】:How to select only 3 records from multiple records in column?如何从列中的多条记录中仅选择 3 条记录?
【发布时间】: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 个随机联系人编号

【问题讨论】:

  • 你真的想要随机还是随意?

标签: sql oracle oracle12c


【解决方案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 替换为任何有意义的内容 - 包括完全删除它。

      【讨论】:

        猜你喜欢
        • 2019-07-23
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多