Сопряжение длинных строк путем присвоения идентификатора материализованному представлению - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь заменить большие строки (пару сотен символов) на идентификаторы, чтобы создать простой материализованный вид парных последовательностей без необходимости сохранять исходную строку. Я создал подзапрос в PostgreSQL с выводом, похожим на приведенный ниже пример (с упрощенными сокращенными строками):

 feat_uniquename | segment1 | segment2 | segment3 
-----------------+---------------------+----------
 SEQ000001.1     | GATA...  | TTTA...  | CTTT...
-----------------+---------------------+----------
 SEQ000001.2     | GATT...  | TTTC...  | CTTT...  
-----------------+---------------------+----------
 SEQ000001.3     | GATG...  | TTTC...  | CTTT...  
-----------------+---------------------+----------
 SEQ000001.4     | GATC...  | TTTA...  | CTTT... 

Я пытаюсь сжать это, чтобы выглядеть следующим образом:

 feat_uniquename | segment1 | segment2 | segment3 
-----------------+---------------------+----------
 SEQ000001.1     | 1        | 1        | 1
-----------------+---------------------+----------
 SEQ000001.2     | 2        | 2        | 1  
-----------------+---------------------+----------
 SEQ000001.3     | 3        | 2        | 1  
-----------------+---------------------+----------
 SEQ000001.4     | 4        | 1        | 1

Оставлять длинные строки в материализованном представлении было бы неэффективно с точки зрения памяти и, вероятно, медленной ассоциацией строк, но я не знаю, как продолжить использовать только SQL. Без использования итеративного процесса (это возможно даже в SQL?), Кажется невозможным связать значения. В крайнем случае, я мог бы сжать строки, используя словари Python, записать в текстовый файл с разделителями и проанализировать, чтобы создать материализованное представление.

1 Ответ

0 голосов
/ 02 ноября 2018

Если у вас есть только три столбца данных, подобных этой, вы можете создать таблицу поиска, сопоставив каждое уникальное значение с произвольным индексом, а затем объединить таблицу при каждом поиске и выбрать столбец индекса. Например,

WITH lookup1 AS (SELECT DISTINCT
    segment1,
    row_number() over(partition by segment1) as index1
)

SELECT
    feat_uniquename,
    index1
FROM
    original_table t1
INNER JOIN
    lookup1 t2
ON t1.segment1 = t2.segment1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...