我们曾要求向外部公司提供一些数据。 他们只需要一个数据样本,简单吧?错。
以下是他们的抽样标准:
记录总数除以720(所需样本大小) - 这会给出采样间隔(如果结果是分数,则向下舍入到下一个整数)。
< / LI>将采样间隔减半以获得起点。
- 通过添加采样间隔来返回每条记录。
实施例
- 10,000记录 - 采样间隔= 13(10,000 / 720)
- 起点= 6(13/2圆)
- 返回记录6,19(6 + 13),32(19 + 13),45(32 + 13)等......
有人可以告诉我在SQL中如何(如果)这样的话。
答案 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