如何在HP Vertica

时间:2015-10-19 03:46:16

标签: sql vertica

我想从表中随机选择4组具有不同行数的数据,并生成一个新的group_name列。

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

ID
---
ID1
ID2
...

我想要的结果表(包含2750行)如下所示:

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

每个组的行数如下:

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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

答案 1 :(得分:0)

您应该使用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)函数

上随机排序