2013-03-21 135 views
0

我有一張表,其中包含道路參考號和道路長度,列RoadID (int)RoadLength (int)使用TSQL隨機選擇記錄總數的百分比

大約有3000行。使用T-SQL我需要提取隨機選擇的道路引用及其長度,其長度總和爲表中所有道路總長度的5%。這是每年進行一次道路調查,隨機選擇道路。

我對SQL Server 2008數據庫使用T-SQL。試圖從這篇文章http://www.sqlservercentral.com/Forums/Topic793008-149-1.aspx三角查詢幾個變化,但努力選擇隨機行。我嘗試使用​​,但我的結果看起來不正確。

任何幫助以最有效的方式來做到這一點,將不勝感激。由於

+0

當使用Order By NewID時,爲什麼結果看起來不正確?你能提供一個例子嗎? – 2013-03-21 12:17:15

+0

我從http://www.sqlservercentral.com/Forums/Topic793008-149-1.aspx調整了這個有用的代碼,但我的運行總數和RoadLength列似乎不相符。我是否在錯誤的地方使用了NEWID()的Order?我現在用的是以下幾點: – Trigpoints 2013-03-21 12:38:04

+0

與Q(RoadID,RoadLength,ROW_NUM) \t \t AS \t \t \t \t \t(SELECT RoadID,RoadLength,ROW_NUMBER()OVER(ORDER BY NEWID()) \t \t \t FROM zt_Roads ), \t \t \t \t \t RunningTotal(RoadID,RoadLength,ROW_NUM,RunningTotal) \t \t \t \t \t AS \t \t \t \t(SELECT *,RunningTotal =(SELECT SUM(RoadLength)FROM q其中ROW_NUM <= A.ROW_NUM) \t \t \t \t自Q AS A) \t \t \t \t \t \t SELECT \t * FROM RunningTotal \t \t \t \t WHERE \t ROW_NUM <=(SELECT MIN(ROW_NUM) \t \t FROM RunningTotal \t \t WHERE RunningTotal> 6000)--test使用6000,理想地希望在這裏使用的參數來計算5%到總長度 – Trigpoints 2013-03-21 12:38:49

回答

0

我不知道如何接近你需要總量的5%,但這應該讓你很接近:

CREATE TABLE #RoadReference (RoadID INT IDENTITY, RoadLength INT) 

INSERT #RoadReference (RoadLength) VALUES (CAST(RAND() * 1000 AS INT)) 
GO 3000 

DECLARE @SampleDistance int 

SELECT @SampleDistance = SUM(RoadLength) * .05 FROM #RoadReference 

SELECT @SampleDistance AS FivePercentOfTotalRoadLength 

SELECT RoadID, SUM(RoadLength) RoadLength 
FROM (
    SELECT TOP 5 PERCENT * 
    FROM #RoadReference ORDER BY NEWID()) DataSample 
GROUP BY RoadID WITH ROLLUP 
ORDER BY RoadLength 
+0

感謝您的幫助@Crosan,非常感謝。我嘗試了幾個版本,然後選擇了隨機記錄,但努力得到一個隨機選擇,其總長度合計爲表中所有道路的5%。我想出了一個混亂的解決方案,但它似乎工作... – Trigpoints 2013-03-22 16:39:15

0

凌亂,但它似乎工作

--Create a temp table and add a random number column 
CREATE TABLE #Roads(ROW_NUM int, RoadID int, RoadLength int) 

--Populate from zt_Roads table and add a random number field 
INSERT #Roads (ROW_NUM , RoadID , RoadLength) 
        (SELECT ROW_NUMBER() OVER (ORDER BY NEWID()), 
         RoadID, 
         RoadLength 
         from zt_Roads) 
go 

--Calcualte 5% of the TOTAL length of ALL roads 
declare @FivePercent int 
SELECT @FivePercent = ROUND(Sum(IsNULL((RoadLength),0))*.01,0) from zt_Roads 
print 'One Percent of total length = ' 
Print @FivePercent 

--Select a random sample from temp table so that the total sample length 
--is no more than 5% of all roads in table 
; with RandomSample as 
(SELECT top 100 percent 
    ROW_NUM, 
    RoadID, 
    RoadLength, 
    RoadLength+ 
     COALESCE((Select Sum(RoadLength) from #Roads b 
     WHERE b.ROW_NUM < a.ROW_NUM),0) as RunningTotal 

     From #Roads a 
     ORDER BY ROW_NUM) 


Select * from RandomSample WHERE RunningTotal <@FivePercent 
Drop table #Roads