Как случайным образом создавать группы с разным количеством строк в HP 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 за один раз, а не делать случайный выбор шаг за шагом?

Спасибо!


person xyin    schedule 19.10.2015    source источник
comment
Итак, параметр - это номер строки для каждой группы? Количество строк равно количеству групп?   -  person Juan Carlos Oropeza    schedule 19.10.2015
comment
@JuanCarlosOropeza Да, единственным параметром является количество строк для каждой группы. Я обновил вопрос, чтобы его было легче понять.   -  person xyin    schedule 19.10.2015


Ответы (2)


Вы должны использовать номер_строки.

и с помощью 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).

person Juan Carlos Oropeza    schedule 19.10.2015

Вы можете сделать что-то вроде этого:

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

Хотя вы, вероятно, захотите поместить его в локальный временный файл, чтобы обобщить его, поскольку группировки и выборки будут меняться при каждом выполнении.

Еще одна идея, если вы хотите сохранить согласованные группы, может заключаться в использовании HASH() с модом вместо чисто случайного. Это создаст одно и то же значение GROUP в каждом запросе.

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