Подготовка данных - заменить цифры и символы в большинстве столбцов таблицы - PullRequest
0 голосов
/ 27 февраля 2019

В настоящее время я заинтересован в подготовке данных, но у меня есть некоторые проблемы с сценарием SQL, над которым я работаю.

Я нашел файл .csv со статистикой уровня преступности, как вы можете видеть здесь:

Скриншот файла .csv

Теперь я хочусделать некоторые изменения в столбцах с 2016 до 2008.Все числа должны быть изменены на 1, а все двоеточия - на 0 для дальнейшей подготовки и анализа данных.Я решил использовать VARCHAR как тип данных для столбцов.Из-за этого я могу изменить двоеточия на 0, но теперь я не могу изменить числа на 1. Это сценарий на данный момент:

DROP TABLE IF EXISTS crime;
CREATE TABLE crime (
id SERIAL,
age VARCHAR,
sex CHAR(1), 
unit VARCHAR,
geo VARCHAR,
"2016" VARCHAR, 
"2015" VARCHAR,
"2014" VARCHAR, 
"2013" VARCHAR,
"2012" VARCHAR, 
"2011" VARCHAR,
"2010" VARCHAR, 
"2009" VARCHAR,
"2008" VARCHAR,
PRIMARY KEY (id)
);

\unset ON_ERROR_STOP

COPY crime(age, sex, unit, geo, "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008") 
FROM 'path' 
delimiter ';' CSV HEADER;

ALTER TABLE crime DROP COLUMN IF EXISTS unit, DROP COLUMN IF EXISTS age;

UPDATE crime SET "2016" = REPLACE("2016", ':', '0'),
"2015" = REPLACE("2015", ':', '0'), 
"2014" = REPLACE("2014", ':', '0'), 
"2013" = REPLACE("2013", ':', '0'), 
"2012" = REPLACE("2012", ':', '0'), 
"2011" = REPLACE("2011", ':', '0'), 
"2010" = REPLACE("2010", ':', '0'), 
"2009" = REPLACE("2009", ':', '0'), 
"2008" = REPLACE("2008", ':', '0');

Я надеюсь, что кто-то может мне помочь.

1 Ответ

0 голосов
/ 28 февраля 2019

Если это всего лишь цифры или :, как указано на скриншоте:

UPDATE crime
SET    "2016" = CASE WHEN "2016" = ':' THEN 0 ELSE 1 END
     , "2015" = CASE WHEN "2015" = ':' THEN 0 ELSE 1 END
  -- , ...
     , "2008" = CASE WHEN "2008" = ':' THEN 0 ELSE 1 END;

Если все, что вас волнует, это 0 и 1, рассмотрите возможность преобразования результата в boolean впоследствии:

ALTER TABLE crime 
  ALTER "2016" TYPE bool USING "2016"::bool
, ALTER "2015" TYPE bool USING "2015"::bool
-- , ...
, ALTER "2008" TYPE bool USING "2008"::bool;

0 -> FALSE
1 -> TRUE

И лучше использовать допустимые идентификаторы, которые не требуют двойных кавычек: c2016, c2015, ...

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