TSQL,我使用的是SQL 2012,但会使用以前版本的任何功能。我知道如何使用NEWID()从表中选择TOP X随机行。另外,我知道如何使用几种方法选择一个运行总计,CTE等。
但是,如何将这两个结果合并为一个查询?所以我想选择说3个随机记录(AND不少于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
答案 0 :(得分:0)
试试这个:
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)