0

RoadID (int)列とで、道路参照番号と道路の長さを含むテーブルがありますRoadLength (int)

約3000行あります。T-SQL を使用して、ランダムに選択された道路参照とその長さを抽出する必要があります。長さの合計は、テーブル内のすべての道路の全長の 5% になります。これは、道路が無作為に選択される毎年の道路調査用です。

SQL Server 2008 データベースに対して T-SQL を使用しています。この記事http://www.sqlservercentral.com/Forums/Topic793008-149-1.aspxの三角クエリでいくつかのバリエーションを試しましたが、ランダムな行の選択に苦労しました。使用してみorder by newID()ましたが、結果が正しくないようです。

これを行うための最も効率的な方法についての助けをいただければ幸いです。ありがとう

4

2 に答える 2

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
于 2013-03-21T14:00:45.590 に答える
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
于 2013-03-22T16:39:19.877 に答える