检索每第五行

时间:2014-08-03 06:19:49

标签: sql sql-server tsql

目标:
从表测试中检索整个数据的1/5。 换句话说,检索表测试中的每第五行。

问题:
如何启用每五行检索数据? 我知道您可以使用代理键,例如ROW_NUMBER,但它需要大量资源。

信息:
*表测试包含1 000 000行。

代码:

表测试
专栏:
a - 带随机数的主键(int)
b - (nvarchar 254)
c - int

3 个答案:

答案 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可能调用的潜在排序。