TSQL使用运行总计选择随机行

TSQL使用运行总计选择随机行,tsql,random,sql-server-2012,cumulative-sum,Tsql,Random,Sql Server 2012,Cumulative Sum,TSQL,我正在使用SQL 2012,但将使用以前版本中的任何东西。我知道如何使用NEWID从表中选择前X个随机行。另外,我知道如何使用多种方法选择运行总数,如CTE等 但是,如何将这两个结果组合到一个查询中呢?所以我想选择3条随机记录,不少于3条,其中运行总数不超过15条。我的头绕不住这个 使用以下简单的表格和数据: CREATE TABLE TblTest ( id int not null identity(1,1) primary key, value int not

TSQL,我正在使用SQL 2012,但将使用以前版本中的任何东西。我知道如何使用NEWID从表中选择前X个随机行。另外,我知道如何使用多种方法选择运行总数,如CTE等

但是,如何将这两个结果组合到一个查询中呢?所以我想选择3条随机记录,不少于3条,其中运行总数不超过15条。我的头绕不住这个

使用以下简单的表格和数据:

CREATE TABLE TblTest (
   id    int not null identity(1,1) primary key,
   value int not null
);

INSERT INTO TblTest (value) VALUES (4);
INSERT INTO TblTest (value) VALUES (3);
INSERT INTO TblTest (value) VALUES (5);
INSERT INTO TblTest (value) VALUES (6);
INSERT INTO TblTest (value) VALUES (6);
INSERT INTO TblTest (value) VALUES (5);
INSERT INTO TblTest (value) VALUES (6);
INSERT INTO TblTest (value) VALUES (5);
INSERT INTO TblTest (value) VALUES (4);
INSERT INTO TblTest (value) VALUES (7);
INSERT INTO TblTest (value) VALUES (7);
INSERT INTO TblTest (value) VALUES (6);
INSERT INTO TblTest (value) VALUES (5);
INSERT INTO TblTest (value) VALUES (4);
下面是我的尝试,我不确定在那里使用NEWID是否有意义,有时它只返回2行,有时返回0行,我希望它足够聪明,总是返回3行,如果可能,最接近15行…:

select top(3) ourRandID,
       id, 
       value, 
       running_total
from (
    select NEWID() as ourRandID, 
            id,
           value,
           sum(value) over (order by NEWID()) as running_total
    from TblTest
) t
where running_total < 16
试试这个:

 select     t.*
 from TblTest t
 join
 (
 select top (1) 
     t1.id [id1],t2.id [id2],t3.id [id3],
     t1.value[v1],t2.value [v2],t3.value [v3],
     t1.value+t2.value+t3.value [sum]
 from TblTest t1
 join TblTest t2 on (t1.id <> t2.id)
 join TblTest t3 on (t3.id <> t2.id and t3.id <> t1.id)
 where t1.value+t2.value+t3.value <= 15
 order by t1.value+t2.value+t3.value desc,newid() 
 ) [a] on (t.id=a.id1 or t.id=a.id2 or t.id=a.id3)

很不错的。我应该考虑回到这样的基本问题上来。到目前为止,它还没有失败/超过15条,并且总是返回3条记录,并且似乎总是总计到15条,这是好的。这很可能就是我的答案。谢谢斯坦利!然而,这是一个慢得多,一旦测试我的现场数据,这是完全不同的。我们希望使用较新的SQL 2012功能—而且如果不重新写入大部分记录,添加v4、v5等,很难将其更改为返回前5条记录或任何数字。当我添加更多表t3、t4时,速度会呈指数级下降。该死的,我需要不同的版本返回到10。。。hmmmi看到如果您添加更多联接,这会变得非常缓慢…也许可以尝试使用sumt1.value+t2.value上的聚集索引将联接预生成到一个新表中。。。