目标:
从表测试中检索整个数据的1/5。
换句话说,检索表测试中的每第五行。
问题:
如何启用每五行检索数据?
我知道您可以使用代理键,例如ROW_NUMBER,但它需要大量资源。
信息:
*表测试包含1 000 000行。
代码:
表测试
专栏:
a - 带随机数的主键(int)
b - (nvarchar 254)
c - int
答案 0 :(得分:2)
我已经使用了ROW_NUMBER()OVER(ORDER BY(SELECT NULL)用于顺序增量值,ID%5用于每个第5个序列。希望这会有所帮助。
测试数据:
IF OBJECT_ID('tempdb..#TestData')>0 DROP TABLE #TestData
CREATE TABLE #TestData (IDa INT, Descriptionb nvarchar (254), INTc int )
;WITH cte_TestData (IDa, Descriptionb , INTc,LEVEL)
AS
(
SELECT 1 AS IDa,CAST('ABC' AS VARCHAR(10)) AS Descriptionb ,5001 AS INTc, 1 as LEVEL
UNION ALL
SELECT td.IDa+1, td.Descriptionb , td.INTc+1, 1+td.LEVEL
FROM cte_TestData td
WHERE td.LEVEL <100
)
INSERT INTO #TestData
SELECT IDa, Descriptionb , INTc FROM cte_TestData ctd
WHERE IDa%3 = 0
<强>查询:强>
;WITH CTE_PreFilter
AS
(
SELECT ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS ID,
IDa,
Descriptionb,
INTc
FROM #TestData
)
SELECT IDa,
Descriptionb,
INTc
FROM CTE_PreFilter
WHERE ID%5 = 0
答案 1 :(得分:1)
执行此操作的有效方法(随机20%的行样本)是:
SELECT * FROM MyTable
WHERE 0.2 >= CAST(CHECKSUM(NEWID(), PrimaryKeyColumn) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
TablePrimaryKeyColumn列包含在CHECKSUM中 表达式,以便NEWID()每行计算一次以实现采样 按行计算。表达式CAST(CHECKSUM(NEWID(), SalesOrderID)&amp; 0x7fffffff AS float / CAST(0x7fffffff AS int) 求值为0到1之间的随机浮点值。
来自here。
答案 2 :(得分:0)
计算主键上的模5。它仍将执行表扫描,但避免row_number可能调用的潜在排序。