Как я могу скопировать одинаковые строки для каждого значения в одном столбце? - PullRequest
0 голосов
/ 12 февраля 2019

Как мне скопировать строки для каждого значения в одном столбце

Допустим, у нас есть столбец типа:

---------------------
record time     id
---------------------
1      12:00    [1,2,3]
2      12:01    [4,5,6,7]
3      12:07    [8,9]

И я хотел бы получить результат как:

---------------------
record time    id
---------------------
1      12:00    1
2      12:00    2
3      12:00    3
4      12:01    4
5      12:01    5
...
9      12:07    9

Мне нужно сделать это в Postgresql или R

Ответы [ 3 ]

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

Вы можете сделать это в PostgreSQL следующим образом:

SELECT DISTINCT record, time, unnest(translate(id, '[]', '{}'):: int[]) AS ids
FROM tbl  
ORDER BY record, time, ids;

По сути, вы создаете массив из своего текстового поля, а затем используете unnest, чтобы получить желаемый результат.

 record |   time   | ids 
--------+----------+-----
      1 | 12:00:00 |   1
      1 | 12:00:00 |   2
      1 | 12:00:00 |   3
      2 | 12:01:00 |   4
      2 | 12:01:00 |   5
      2 | 12:01:00 |   6
      2 | 12:01:00 |   7
      3 | 12:07:00 |   8
      3 | 12:07:00 |   9

DEMO

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

В Postgres вы просто используете unnest():

select t.record, t.time, unnest(t.id) as id
from t;

Это предполагает, что ваш столбец действительно хранится как массив в Postgres.Если это строка, вы можете сделать что-то похожее, но для этого нужно больше манипулировать строками.

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

Один из вариантов - separate_rows, если идентификатор - string

library(tidyverse)
df1 %>%
    separate_rows(id) %>%
    filter(id != "") %>%
    mutate(record = row_number())
#  record  time id
#1      1 12:00  1
#2      2 12:00  2
#3      3 12:00  3
#4      4 12:01  4
#5      5 12:01  5
#6      6 12:01  6
#7      7 12:01  7
#8      8 12:07  8
#9      9 12:07  9

Если идентификатор - list

df1 %>% 
   unnest

.

 df1 <- structure(list(record = 1:3, time = c("12:00", "12:01", "12:07"
 ), id = c("[1,2,3]", "[4,5,6,7]", "[8,9]")), class = "data.frame", 
 row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...