SQL数据采样

时间:2012-02-23 12:47:23

标签: sql

我们曾要求向外部公司提供一些数据。 他们只需要一个数据样本,简单吧?错。

以下是他们的抽样标准:

  
      
  • 记录总数除以720(所需样本大小) - 这会给出采样间隔(如果结果是分数,则向下舍入到下一个整数)。

    < / LI>   
  • 将采样间隔减半以获得起点。

  •   
  • 通过添加采样间隔来返回每条记录。
  •   
     

实施例

     
      
  • 10,000记录 - 采样间隔= 13(10,000 / 720)
  •   
  • 起点= 6(13/2圆)
  •   
  • 返回记录6,19(6 + 13),32(19 + 13),45(32 + 13)等......
  •   

有人可以告诉我在SQL中如何(如果)这样的话。

4 个答案:

答案 0 :(得分:3)

如果你使用ROW_NUMBER(),那么你可以相对容易地做到这一点。

SELECT
  *
FROM
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY a, b, c, d) AS record_id,
    *
  FROM
    yourTable
)
  AS data
WHERE
  (record_id + 360) % 720 = 0

ROW_NUMBER()为您的所有数据提供顺序标识符(这很重要,因为id字段必须都是唯一的,并且没有任何间隙)。它还定义了您希望(ORDER BY a, b, c, d)中的数据的顺序。

使用该ID,如果您使用Modulo(通常是%运算符),您可以测试该记录是第720条记录,第1440条记录等(因为720%720 = 0)。

然后,如果您将id值偏移360,则可以更改结果集的起点。

修改

重新阅读问题之后,我看到你不想要每720条记录,但统一选择了720条记录。

因此,请将720替换为(SELECT COUNT(*) / 720 FROM yourTable)

360替换为(SELECT (COUNT(*) / 720) / 2 FROM yourTable)

修改

忽略舍入条件将允许精确720条记录的结果。这需要使用非整数值,并且模数的结果小于1.

WHERE
  (record_id + (SELECT COUNT(*) FROM yourTable) / 1440.0)
  %
  ((SELECT COUNT(*) FROM yourTable) / 720.0)
  <
  1.0

答案 1 :(得分:1)

declare @sample_size int, @starting_point int

select @sample_size = 200

select top (@sample_size) col1, col2, col3, col4 
from (
    select *, row_number() over (order by col1, col2) as row
    from your_table
) t
where  (row   % ((select count(*) from your_table) / @sample_size)) - (select count(*) from your_table) / @sample_size / 2) = 0

它将在SQL Server 2005 +中起作用。

TOP (@variable)用于限制行(where条件因为整数舍入可能不够,可能会返回更多行然后需要)和ROW_NUMBER()来编号和排序行。

工作示例:http://data.stackexchange.com/stackoverflow/query/62315/sql-data-sampling代码:

declare @tab table (id int identity(1,1), col1 varchar(3), col2 varchar(3))

declare @i int

set @i = 0

while @i <= 1000
begin
  insert into @tab
  select 'aaa', 'bbb'
  set @i = @i+1
end

declare @sample_size int

select @sample_size = 123

select ((select count(*) from @tab) / @sample_size) as sample_interval

select top (@sample_size) *
from (
    select *, row_number() over (order by col1, col2, id desc) as row
    from @tab
) t
where  (row   % ((select count(*) from @tab) / @sample_size)) - ((select count(*) from @tab) / @sample_size / 2) = 0

答案 2 :(得分:0)

SQL Server具有内置函数。
SELECT FirstName,LastName 来自Person.Person 表格样本(10%);

答案 3 :(得分:-1)

您可以使用排名来获取行号。以下代码将在表中创建10000条记录,然后选择第6条,第19条,第32条等,共计769行。

CREATE TABLE Tbl (
    Data varchar (255)
)
GO

DECLARE @i int 
SET @i = 0
WHILE (@i < 10000)
BEGIN
    INSERT INTO Tbl (Data) VALUES (CONVERT(varchar(255), NEWID()))
    SET @i = @i + 1
END
GO

DECLARE @interval int
DECLARE @start int
DECLARE @total int
SELECT  @total = COUNT(*),
        @start = FLOOR(COUNT(*) / 720) / 2,
        @interval = FLOOR(COUNT(*) / 720)
FROM Tbl

PRINT 'Start record: ' + CAST(@start as varchar(10)) 
PRINT 'Interval: ' + CAST(@interval as varchar(10)) 

SELECT rank, Data
FROM (
    SELECT rank() 
    OVER (ORDER BY t.Data) as rank, t.Data AS Data
    FROM Tbl t) q
WHERE   ((rank + 1) + @start) % @interval = 0