【问题标题】:How do I select random rows from a database -- With a twist?如何从数据库中选择随机行 - 有一个转折点?
【发布时间】:2012-08-28 20:17:44
【问题描述】:

假设(高度匿名):

Create Table myTable
(
ID INT PK,
INDEXNUMBER INT,
VERSION INT,
Data VARCHAR(MAX)
)

此表用于存储互斥数据。 例如:

100 1 1 BOB
217 1 2 JOHN
319 1 3 GEORGE
420 7 1 MARY
415 7 2 SUSAN

在这种情况下,我需要随机选择 BOB、JOHN 或 GEORGE 中的一个和 MARY 或 SUSAN 中的一个。

我对 ID 或 INDEXNUMBER/VERSION 对感到满意。

如果考虑一下的话,这就像从包含花名册的表格中挑选一支曲棍球队的单班:

从 3 个可用的中心中选择 1 个, 从 5 个可用的左翼中选择 1 个,等等。

我一直在玩NEWID()MAX/MIN(先将NEWID 转换为varchar),但我一直挂断GROUP BY。如果我GROUP BY ID,那么 max 一次只对一行进行操作,产生整个表。

如果我 GROUP BY INDEXNUMBER, VERSION 我得到类似的结果(这对是唯一的)。

我需要做的是GROUP BY INDEXNUMBER(从查询中完全排除ID)但以某种方式检索VERSION

【问题讨论】:

    标签: sql-server random


    【解决方案1】:

    INDEXNUMBER 分区(我假设您需要每个分区,尽管没有特别说明)并通过NEWID() 订购

    SELECT ID
    FROM (
        SELECT 
            Row_Number() OVER (PARTITION BY INDEXNUMBER ORDER BY NEWID()) Sort,
            ID, 
            Data
        FROM myTable
    ) s
    WHERE Sort = 1
    

    Sql Fiddle

    【讨论】:

      【解决方案2】:

      解决方案很简单,将数据与临时表连接起来。 请看我的示例代码:

      --drop temp table if exists...
      if OBJECT_ID('tempdb..#tempData') is not null
      begin
       drop table #tempData
      end
      go
      
      --select distinct INDEXNUMBER and fill temp table...
      select distinct INDEXNUMBER into #tempData
      from myTable
      go
      
      --join temp table with actual data to get randon rows...
      select T.INDEXNUMBER,
      (
        select top 1 VERSION 
        from myTable where 
        INDEXNUMBER=T.INDEXNUMBER 
        order by NEWID()
      ) 'Version'
      from #tempData T
      

      此语法适用于 SQL Server。编码愉快!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多