【问题标题】:Select a random row from each group SQL Server从每个组 SQL Server 中选择一个随机行
【发布时间】:2016-12-13 10:27:22
【问题描述】:

我有一张像下面这样的表格

ID   Code   Age
----------------
1    4758   21
1    7842   14
1    9821   23
1    6842   9
2    8472   24
2    7558   31
2    7841   28
3    7881   38
3    8794   42
3    4871   43    

对于每个 ID,我想像这样随机选择其中一行

ID   Code   Age
----------------
1    7842   14    
2    7841   28
3    4871   43 

这在 SQL Server 中可行吗?

【问题讨论】:

    标签: sql-server


    【解决方案1】:
    select top 1 with ties id,code,age 
    from
    table
    order by row_number() over (partition by id order by rand())
    

    更新:根据这个Return rows in random order,你必须使用NEWId,因为RAND() is fixed for the duration of the SELECT on MS SQL Server.

     select top 1 with ties id,code,age 
     from
     table
    order by row_number() over (partition by id order by NEWID())
    

    【讨论】:

      【解决方案2】:

      Row_number()的子句顺序使用Newid()

      SELECT [ID], [Code], [Age]
      FROM   (SELECT *,
                     Row_number()
                       OVER(
                         PARTITION BY ID
                         ORDER BY Newid()) RNO
              FROM   #Table1)A
      WHERE  RNO = 1 
      

      【讨论】:

        【解决方案3】:
        with cte as
        (
        select *,rank() over ( partition  by id order by Newid()) as rn from #c
        )
        select id,code,age from cte where rn=1
        

        【讨论】:

          【解决方案4】:

          要每次选择不同的集合,请在order by 子句中使用checksum(newid())

          查询

          ;with cte as(
              select *, rn = row_number() over(
                  partition by ID
                  order by abs(checksum(newid())) % 15
              )
              from [your_table_name]
          )
          select * from cte
          where rn = 1;
          

          【讨论】:

            猜你喜欢
            • 2010-10-25
            • 2016-06-17
            • 1970-01-01
            • 2020-09-23
            • 2019-12-02
            • 2012-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多