SQL Sever 中随机抽样,分层抽样和平衡抽样

3.3 对表做抽样

3.3.1 随机抽样

--获取10%的随机样本数据
SELECT t.*
FROM <t> t
WHERE RAND() < 0.1

但是不能用在SQL Sever中,要用 NEWID(),可是有个问题是这样必须为表汇总的所有记录排序,
过于耗费资源,解决办法是使用NEWID()

SELECT TOP PERCENT t.*
FROM <T> t
ORDER BY NEWID()
返回数据的10%

SELECT t.*
FROM <t> t
WHERE RAND(CHECKSUM(NEWID())) < 0.1
这个查询为随机数生成器提供种子,每次调用时的种子都不同,以满足每次调用时对不同值的需求。

3.3.2 可重复的随机样本
使用ID作为随机数生成器的种子:

SELECT t.*
FROM <t> t
WHERE RAND(id) < 0.1

每次输入某个ID时,都会生成同样的随机数,为了获取不同的样本,可以修改种子:
WHERE RAND(id + 1) < 0.1
另一个方法是基于 ROW_NUMBER()的伪随机数生成器。
WITH t as (
			 SELECT t.*, ROW_NUMBER() OVER (ORDER BY col) as seqnum
			 FROM <t> t
	)
SELECT t.*
FROM t
WHERE (t * 17 + 57) % 101 <= 10;

3.3.3 分层比例抽样
分层抽样能够保证列值的分布和整体分布相近,subscribers表有47.18%的活跃的订阅者。
WITH a as (
				SELECT s.*, ROW_NUMBER() OVER (ORDER BY isactive) as seqnum
				FROM subscribers s
					)
SELECT AVG(1.0 * isactive)
FROM a
WHERE seqnum % 100 = 1;

CTE依次为非活跃者和活跃者分配连续的数字,然后每隔99个数据抽取第100个数据,这个程序从每100个
非活跃者中抽取一条数据,从100个活跃者中抽取一条数据。返回值47.18,与原始数据相同

分层抽样的优势在于可以应用于不止一个变量,下面例子,包含以市场和活跃度划分的与原始数据相同比例的样本

WITH s as (
		SELECT s.*, ROW_NUMBER() OVER (ORDER BY market, isactive) as sequm
		FROM subscribers s
)
SELECT AVG(isactive)
FROM s
WHERE sequm % 100 = 1;

3.3.4 平衡的样本

WITH o as (
			SELECT o.*,
			ROW_NUMBER() OVER (PARTITION BY isae ORDER BY NEWID()) as seqnum
			FROM (SELECT o.*,
									 (CASE WHEN paymenttype = 'AE' THEN 1 ELSE 0 END) as isae
						FROM orders o
						WHERE totalprice <= 200
					) o
			)
SELECT orderdate,
			(CASE WHEN isae = 1 THEN totalprice END) as ae,
			(CASE WHEN isae = 0 THEN totalprice END) as notae
FROM o
WHERE seqnum <= 100;

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server,`DROP`命令**用于删除数据库对象,如表、视图、索引、函数等**。其基本语法为:`DROP OBJECT_TYPE object_name;` 其`OBJECT_TYPE`代表要删除的对象类型,可以是表(`TABLE`)、视图(`VIEW`)、索引(`INDEX`)、函数(`FUNCTION`)等;`object_name`代表要删除的对象名。 具体来说,`DROP`语句的作用包括: 1. **删除表**:使用`DROP TABLE table_name;`可以删除整个表及其结构,包括表的数据、约束、索引等。 2. **删除视图**:使用`DROP VIEW view_name;`可以删除一个或多个视图定义。 3. **删除索引**:使用`DROP INDEX index_name ON table_name;`可以删除表上的一个或多个索引。 4. **删除函数**:使用`DROP FUNCTION function_name;`可以删除用户定义的函数。 此外,`DROP`语句执行后,依赖于该对象的其他数据库对象(如存储过程、视图等)可能会变为无效状态,需要手动更新或删除这些依赖对象。 在使用`DROP`命令时,需要注意以下几点: 1. 确保要删除的对象不再被其他对象引用或依赖,否则可能导致错误或意外的数据丢失。 2. `DROP`命令通常无法撤销,因此在执行前应仔细检查命令的正确性。 3. 如果需要删除多个对象,可以为每个对象类型分别使用`DROP`命令,或者在一个查询连续使用多个`DROP`命令。 总之,`DROP`是SQL Server一个非常强大的命令,用于删除各种数据库对象。在使用时必须谨慎,以避免不必要的数据丢失或系统错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值