2012-11-14 40 views
1

TSQL,我正在使用SQL 2012,但將使用以前版本的任何工作。我知道如何使用NEWID()從表中選擇TOP X隨機行。另外,我知道如何使用幾種方法,CTE等選擇運行總數。TSQL選擇運行總數的隨機行

但是,如何將這2個結果合併爲一個查詢?所以我想選擇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

試試這個:

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) 
+0

非常好。我應該考慮回到這樣的基礎。到目前爲止,這還沒有失敗/超過15,並且總是返回3條記錄,並且似乎總是15,這是好的。這很可能是我的答案。謝謝斯坦利! – user1822533

+0

但是,一旦測試完全不同的實時數據,這個速度會慢很多。希望能夠使用更新的SQL 2012功能\t - 也很難將其更改爲返回TOP 5記錄(或任何數量),而無需重新編寫大部分記錄,添加v4,v5等。而當我確實增加了更多的表格,t3,t4,它的指數變慢。我需要不同的版本返回到10 ...嗯 – user1822533

+0

我看到如果這可以變得非常緩慢,如果你添加更多的連接...也許嘗試預生成連接到一個新的表與聚集索引sum( t1.value + t2.value ...) – Stanley