2016-02-27 3 views
1

У меня есть таблица со слишком длинными записями с 1s и 0s. Например, у меня есть таблица:Разделите таблицу сырыми в куски в Postgres

| Sent id.| BoW. | 
|---------|----------| 
| 1 | 10100101 | 
| 2 | 00011110 | 
| 3 | 10101111 | 

Я хочу создать новую таблицу, которая разделит колонку BoW. записи в произвольную длину (в этом случае 4) и присваивает номер куска.

| Sent id.| Chunk No. | BoW. | 
|---------|-----------|------| 
| 1 |  1  | 1010 | 
| 1 |  2  | 0101 | 
| 2 |  1  | 0001 | 
| 2 |  2  | 1110 | 
| 3 |  1  | 1010 | 
| 3 |  2  | 1111 | 

Я начинаю, пытался найти документацию, но безуспешно. Может быть что-то подобное, но с правильной функции:

CREATE TABLE Bow2 AS 
    SELECT Sent_id, 
     (Chunk+1) AS Chunk_No, 
     BoW/div(4) AS BoW; 
    FROM Bow1; 

ответ

5

Один метод, который приходит на ум, является использование generate_series():

select b.sent_id, chunk, substring(bow from (chunk - 1) * 4 + 1 for 4) 
from (select b.sent_id, generate_series(1, 1 + floor(length(bow) - 1/4)) as chunk 
     from bow1 b 
    ) b; 

Этот метод является гибким, поскольку он приспосабливается к различным длинам bow.

1

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

SELECT SentId, chunk.id, SUBSTRING(BoW FROM chunk.v FOR 4) AS BoW 
FROM (VALUES (1, 1), (2, 4)) AS chunk(id, v) 
CROSS JOIN mytable 

Запрос использует таблицу в линию, содержащую исходную позицию каждого фрагмента. Длина фиксирована, и предполагается, что она равна 4. Вы можете настроить запрос в соответствии с вашими фактическими данными.

Demo here

+0

Спасибо, это то, что я хочу, но мне нужно число Chunk сравнить записи позже. – Masyaf

+0

@ Масяф Боюсь, я тебя не понимаю. –

+0

Я имею в виду, что ваш ответ отображает SentId и Chunk, мне нужны SentId, ChunkID и Chunk. Chunk он должен увеличиваться каждый раз, когда создается кусок. – Masyaf

0

Подобно тому, как предложение:

with recursive t(num, head, tail) as (
    select 1, substring('1234567890', 1, 3), substring('1234567890', 4) 
    union all 
    select num+1, substring(tail, 1, 3), substring(tail, 4) from t where tail > '') 
select * from t; 

num | head | tail 
-----+------+--------- 
    1 | 123 | 4567890 
    2 | 456 | 7890 
    3 | 789 | 0 
    4 | 0 | 
(4 rows) 
Смежные вопросы