РЕДАКТИРОВАННЫЙ ВОПРОС:
У меня есть таблица
CREATE TABLE my_table (id INT, type_key int, rate_1 double precision, rate_2 double precision);
INSERT INTO my_table (id, type_key, rate_1, rate_2)
VALUES
(1, NULL, 0.2, 3),
(2, 1, 1.3, 5),
(3, 1, NULL, 10),
(4, 2, 0.5, NULL),
(5, 2, 0.01, 0),
(6, 2, 0.75, NULL),
(7, 3, NULL, NULL),
(8, 3, 0.34, 1),
(9, 3, NULL, 1);
И в идеале результирующая таблица должна быть:
(id, score_1, score_2)
(1, NULL, NULL),
(2, 0, 4),
(3, NULL, 3),
(4, 2, NULL),
(5, 2, 4),
(6, 3, NULL),
(7, NULL, NULL),
(8, 4, 2),
(9, NULL, 3);
на основе пороговых значений оценки, как:
CASE WHEN type_key = 1 THEN (
CASE
WHEN rate_1 > .7 THEN 0
WHEN rate_1 > .5 THEN 1
WHEN rate_1 > .4 THEN 2
WHEN rate_1 > .3 THEN 3
ELSE 4
(и повторите для каждого type_key_n и rate_n)
ОРИГИНАЛЬНЫЙ ВОПРОС:
У меня есть таблица, для простоты, скажем, у нее есть три столбца: date
, name
и value
.
Я хочу создать таблицу на основе этого, где я отсортировал каждое имя в ячейки на основе величины value
.
Теперь, один из способов сделать это - написать:
CREATE TABLE resulting_table AS
(SELECT DATE,
name,
CASE
WHEN value >= magnitude_1 THEN result_1
WHEN value >= magnitude_2 THEN result_2
WHEN value >= magnitude_n THEN result_n
END AS bins
FROM my_table)
, но с увеличением n этот запрос становится очень длинным и довольно неразборчивым.И если у меня разные пороговые величины для разных name
с, то мне нужно сделать вложенный оператор case следующим образом:
CREATE TABLE resulting_table AS
(SELECT DATE,
CASE
WHEN name = 'name_n' THEN
CASE
WHEN value >= name_n_magnitude_n THEN result_n_n
END AS bins
FROM my_table)
, что означает, что запрос становится еще длиннее и менее разборчивым.
У меня есть две идеи, как решить эту проблему, но я не совсем уверен, что лучше или как я бы их реализовал.
1) Создайте отдельную таблицу для всех name
, magnitude
и result
комбинаций.Присоединитесь к этой таблице с помощью my_table
, чтобы получить resulting_table
2) Используйте смесь postgresql / psycopg2 и python, чтобы реализовать эту логику в удобном для чтения виде.
Любые мыслиВот?Похоже, что это будет распространенная проблема очистки данных / инженерии данных.