【问题标题】:SQL select random recordSQL选择随机记录
【发布时间】:2016-03-10 16:39:49
【问题描述】:

我有一张如下表,希望选择不同的人,例如第 2、9、11、20 行。我不想选择 MAX(),因为这不是随机的。而且我不想选择 Jack 两次。每组记录必须是一个人

ID  Name    Category Level
1   Jack    Dragon     3
2   Jack    Falls      5
3   Jack    Spider     5
4   Jack    Apprentice 1
5   Jack    Jolly      5
6   Luke    Dragon     1
7   Luke    Falls      1
8   Luke    Spider     3
9   Luke    Apprentice 5
10  Luke    Jolly      5
11  Mark    Dragon     3
12  Mark    Falls      3
13  Mark    Spider     1
14  Mark    Apprentice 3
15  Mark    Jolly      1
16  Sam     Dragon     3
17  Sam     Falls      5
18  Sam     Spider     5
19  Sam    Apprentice  5
20  Sam    Jolly       3

【问题讨论】:

  • 你说“不同的人”是什么意思?名称必须是唯一的吗?还是名称和类别的组合?如果选择 ID=2 (Jack, Falls),那么可以选择 7 (Luke, Falls) 吗?在您的示例(2、9、11、20)中,每个名称都是唯一的,每个类别也是唯一的,因此不清楚这是否是要求。另一方面,我想级别无关紧要,因为在您的示例中,2 和 9 的级别 = 5,而 11 和 20 的级别 = 3。

标签: sql sql-server random newid


【解决方案1】:

假设记录集 = 具有相同“名称”值的行:

with cte_random
as
(
select *, rank() over (partition by forenames order by newid()) as rnk from tbl
)
select id, name, category, level from cte_random where rnk = 1

【讨论】:

    【解决方案2】:
    SELECT DISTINCT name
    from tbl
    ORDER BY NEWID()
    

    【讨论】:

    • 这将只选择名称字段?我想要整张唱片。结果应该返回 4 行
    【解决方案3】:

    这似乎比听起来更棘手,创建一个带有额外 tempId 列的 temp 表应该可以工作。试试:

    create table #temp(ID int, Name char(10), Category char(10), Level int, tempId varchar(36))
    
    insert #temp select ID, Name, Category, Level, NEWID() as 'tempId' from yourTable
    select ID, Name, Category, Level from #temp where ID IN
        (select min(tempId) from #temp group by Name)
    
    drop table #temp
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多