2015-05-14 62 views
5

我有一個大學畢業生數據庫,想提取大約1000條記錄的隨機數據樣本。帶組的SQL隨機樣本

我要保證樣品的代表性人口的所以想包括相同比例的課程,例如

enter image description here

我能做到這一點使用下列內容:

select top 500 id from degree where coursecode = 1 order by newid() 
union 
select top 300 id from degree where coursecode = 2 order by newid() 
union 
select top 200 id from degree where coursecode = 3 order by newid() 

但是我們有數百個課程代碼,因此這將非常耗時,我希望能夠針對不同的樣本大小重複使用此代碼,並且不特別想要通過查詢並對樣本大小進行硬編碼。

任何幫助,將不勝感激

+1

如何確保我在樣本中得到正確的比例? –

+0

你如何計算樣本量?它是基於人口比例嗎? –

+0

樣本將用於調查問卷,因此樣本的大小取決於我們有多少預算..不是非常科學,我知道! –

回答

9

你想要一個分層抽樣。我會建議按課程代碼對數據進行排序並做第n個樣本。這裏有一個方法,效果最好,如果你有一個大的人口規模:

select d.* 
from (select d.*, 
      row_number() over (order by coursecode, newid) as seqnum, 
      count(*) over() as cnt 
     from degree d 
    ) d 
where seqnum % (cnt/500) = 1; 

編輯:

您還可以計算每個組「對飛」的人口規模:

select d.* 
from (select d.*, 
      row_number() over (partition by coursecode order by newid) as seqnum, 
      count(*) over() as cnt, 
      count(*) over (partition by coursecode) as cc_cnt 
     from degree d 
    ) d 
where seqnum < 500 * (cc_cnt * 1.0/cnt) 
+0

輝煌,謝謝。我剛剛對數據進行了快速檢查,樣本與人口比例之間的最大差異爲0.748%,這是完全可以接受的。 –

1

添加一個表,用於存儲​​。

我想應該是這樣的:

SELECT * 
FROM (
    SELECT id, coursecode, ROW_NUMBER() OVER (PARTITION BY coursecode ORDER BY NEWID()) AS rn 
    FROM degree) t 
    LEFT OUTER JOIN 
    population p ON t.coursecode = p.coursecode 
WHERE 
    rn <= p.SampleSize 
0

我使用ROW_NUMBER方法做了類似的查詢(但不是在MS SQL):

select ... 
from 
(select ... 
    ,row_number() over (partition by coursecode order by newid()) as rn 
    from degree 
) as d 
join sample size as s 
on d.coursecode = s.coursecode 
and d.rn <= s.samplesize 
1

這是不根本不需要劃分人口。

如果您正在從數百個課程代碼中的人口中抽取1000個樣本,那麼在任何一次抽樣中都不會選擇許多課程代碼。

如果人口是統一的(例如,連續的學生證號),均勻分佈的樣本將自動代表按課程代碼進行的人口加權。由於newid()是一個統一的隨機採樣器,所以你可以很好地開箱即用。

您可能遇到的唯一問題是學生證是否與多個課程代碼相關聯。在這種情況下,創建一個包含順序ID,學生ID和課程代碼的唯一列表(臨時表或子查詢),從中抽取順序ID,按學生ID進行分組以刪除重複項。