SQL数据采样

Ric*_*ale 5 sql

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

以下是他们的抽样标准:

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

  • 将采样间隔减半以获得起点.

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

例:

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

请有人告诉我如何(如果)这样的东西在SQL中是可能的.

Mat*_*lie 5

如果您使用 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)