如何在 HP Vertica 中随机创建具有不同行数的组

How to randomly create groups with different numbers of rows in HP Vertica

我想从一个table中随机select4组行数不同的数据,生成一个新的列group_name。

例如,如果原始 table(包含 10000 行)是这样的:

ID
---
ID1
ID2
...

我想要的结果table(包含2750行)如下:

ID   GROUP
---  -----
ID1  1
ID2  3
...  ...

每组的行数如下:

group1 1000 rows
group2 1000 rows
group3 500 rows
group4 250 rows

这些随机生成的组在行中不应有任何重叠。

有没有办法一次性在 Vertica 中执行此操作,而不是随机 select 逐步执行?

谢谢!

你应该使用row_number

并使用 CTE

WITH cte AS (
    SELECT ID, row_number() over () as RN
    FROM YourTable
)
SELECT ID,
   CASE 
      WHEN rn <= 1000 then 1
      WHEN rn <= 2000 then 2
      WHEN rn <= 2500 then 3
      WHEN rn <= 2750 then 4
  END as GROUP
FROM cte
WHERE rn <= 2750

如果你想要更随机,你可以创建一个 random 列并在 row_number() over (order by random) 函数上随机排序

你可以这样做:

SELECT ID, randomint(4)+1 as GROUP
FROM mytable
ORDER BY random()
LIMIT 2750

尽管您可能希望将其填充到本地临时文件中以对其进行总结,因为分组和选择会在每次执行时发生变化。

如果你想保持一致的分组,另一个想法可能是使用 HASH() 和 mod 而不是纯粹随机的。这将在每个查询中创建相同的 GROUP 值。

SELECT ID, (HASH(ID) % 4)+1 as GROUP
FROM mytable
ORDER BY random()
LIMIT 2750