Создание столбца Bin в Postgres для проверки целого числа и возврата строки - PullRequest
0 голосов
/ 25 мая 2018

У меня большой набор данных в базе данных Postgres, и мне нужно сгенерировать поле, которое группирует строки в соответствующие ячейки для "0-100", "101-200", "201-300" и т. Д.до почти 5000. Я знаю, что я мог бы вручную обновить каждую строку и создать строку кода для каждого бина, как это:

update test
   set testgroup = '0-100' where testint >= 1 and distance < 100;

Я действительно хотел бы найти более эффективный способ сделать это, открыта для всего и вся!Основная цель состоит в том, чтобы взглянуть на целое число в этом столбце testint, а затем, если оно находится в диапазоне 1-100, вернуться в столбец тестовой группы "0-100".

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Используйте функцию width_bucket.См. документы , но вот краткая версия синтаксиса:

width_bucket(a, LBound, UBound, num_bins)

Чтобы заставить его работать должным образом для ваших корзин, я должен добавить 1 к UBound.Некоторые примеры:

select width_bucket( 1, 0, 5001, 50) дает 1
select width_bucket(100, 0, 5001, 0) дает 1
select width_bucket(101, 0, 5001, 50) дает 2
select width_bucket(4900, 0, 5001, 50) дает 49
select width_bucket(4901, 0, 5001, 50) дает 50

Так что это работает, как ожидалось.Далее нам нужно сгенерировать правильную строку.Псевдоформат

(width_bucket - 1)*100 || '-' || (width_bucket)*100

Где ||является оператором конкатенации SQLИспользуя первый предыдущий пример:

select (width_bucket(1, 0, 5001, 50)-1)*100 || ' - ' || width_bucket(1, 0, 5001, 50)*100

дает '0 - 100'

Sweet.Теперь собираем все вместе.Сначала создайте таблицу для песочницы, которую вы можете использовать для тестирования.Это будет копия или частичная копия ваших данных:

CREATE TABLE test
AS
SELECT * 
FROM original_table 

Затем добавьте новый столбец в таблицу:

ALTER TABLE test
  ADD COLUMN testgroup text

Теперь оператор UPDATE:

UPDATE test
   SET testgroup = width_bucket(testint, 0, 5001, 50)-1)*100 || ' - ' || 
                   width_bucket(testint, 0, 5001, 50)*100
0 голосов
/ 25 мая 2018

Вы можете использовать generate_series для генерации чисел от 0 до 50, а затем для выбора данных между сгенерированными значениями * 100 и следующим сгенерированным значением * 100. Тот же принцип используется для построения имени ячейки.

UPDATE test
SET testgroup = (x*100)+1 || '-' || (x+1)*100
FROM generate_series(0,50) f(x)
WHERE testint > (x*100) 
  AND testint <= ((x+1)*100);

http://rextester.com/FXIS37706

...