SQL中的随机样本组而不是行



假设我的表格是这样的:

+---------------------+
|ColA   | ColB | ColC |
+---------------------+
| AA       C        5 |      
| AA       C        8 |     
| AA       C        9 |      
| BB       D        3 |      
| BB       D        4 |    
| CC       E        1 |    
| CC       E        2 |     
| CC       E        3 |     
| CC       E        5 |    
+---------------------+

我想从cola随机抽样组,而不是行。每一组是一个事件序列,我想要所有这些事件为每一组,所以这就是为什么我不想只是采样行。我想做如下示例:

+---------------------+
ColA  | ColB |   ColC 
+---------------------+
| AA       C        5 |      
| AA       C        8 |     
| AA       C        9 |    
| CC       E        1 |      
| CC       E        2 |      
| CC       E        3 |     
| CC       E        5 |      
+---------------------+

下面显然是采样行,所以它不是很好。

SELECT * FROM TABLE TABLE_SAMPLE BERNOULI(1)
GROUP BY COLUMN A

我也有一个包含10个组的colb,我希望所有这些组的总行数相等。谢谢你!

在Presto/Trino中没有这样做的直接方法。不过,您可以采用几种方法。

如果您想要确定性抽样,您可以通过应用统一哈希函数并选择组的百分比将组转换为数字。例如:

SELECT *
FROM t
WHERE bitwise_and(from_big_endian_64(xxhash64(cast(a as varbinary))), 1023) <= 0.5 * 1023

  • 计算具有xxhash64:xxhash64(cast(a as varbinary))的分组列的哈希值。生成64位二进制值。
  • 使用from_big_endian_64将二进制值转换为数字,并使用bitwise_and(x, 1023)从中取出10位。生成一个介于0和1023之间的数字。
  • 1%取样,选择任意组,使上述值小于0.01 * 1023。

如果要对组进行非确定性随机抽样,可以先对组进行抽样,然后选择与这些组相匹配的行:

WITH 
groups AS (SELECT DISTINCT colA FROM t),
sampled_groups AS (SELECT * FROM groups TABLESAMPLE BERNOULLI(1)),
SELECT * 
FROM t
WHERE colA IN (TABLE sampled_groups)

最新更新