Развернуть столбец, содержащий списки JSON

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

import matplotlib.pyplot as plt

fig = plt.figure()
plot = fig.add_subplot(111)

# create some curves
for i in range(4):
    plot.plot(
        [i*1,i*2,i*3,i*4],
        gid=i)

def on_plot_hover(event):
    for curve in plot.get_lines():
        if curve.contains(event)[0]:
            print "over %s" % curve.get_gid()

fig.canvas.mpl_connect('motion_notify_event', on_plot_hover)           
plt.show()
0
задан Moody_Mudskipper 18 March 2019 в 12:23
поделиться

3 ответа

Вы можете использовать функцию json_populate_recordset. https://www.postgresql.org/docs/11/functions-json.html Лучше всего использовать в качестве бокового и должен создать тип раньше.

postgres=# CREATE TYPE x AS (a int, b int);
CREATE TYPE
postgres=# CREATE TABLE y(id int, c json);
CREATE TABLE
postgres=# INSERT INTO y VALUES(1,'[{"a":1},{"a":2,"b":3},{"b":4}]');
INSERT 0 1
postgres=# SELECT z.* FROM y, json_populate_recordset(NULL::x, c) z;
┌───┬───┐
│ a │ b │
╞═══╪═══╡
│ 1 │   │
│ 2 │ 3 │
│   │ 4 │
└───┴───┘
(3 rows)

postgres=#

===== edit: ====

пример на вашем столе:

DROP TABLE IF EXISTS moodys_table;
BEGIN;
CREATE TABLE moodys_table ("ID" int, json_col json);
--INSERT INTO moodys_table VALUES (1, '[{"A":"foo11", "B":[{"C":"bar111", "D":"baz111"},{"C":"bar112", "D":"baz112"}],{"A":"foo12","B":[{"C":"bar121", "D":"baz121"}]}]'::json);
--missing braces in json
INSERT INTO moodys_table VALUES (1, '[{"A":"foo11", "B":[{"C":"bar111", "D":"baz111"},{"C":"bar112", "D":"baz112"}]},{"A":"foo12","B":[{"C":"bar121", "D":"baz121"}]}]'::json);
INSERT INTO moodys_table VALUES (2, '[{"A":"foo21", "B":[{"C":"bar211", "D":"baz211"}]}]'::json);

CREATE TYPE btype AS ("C" varchar, "D" varchar);
CREATE TYPE json_col_type AS ("A" text, "B" json); --btype[]);

SELECT * FROM moodys_table;

SELECT "ID", data."A", data2.*
, dense_rank() over(partition by "ID" ORDER BY "A") json_col_id
, dense_rank() over(partition by "ID", "A" ORDER BY "C", "D") b_id
--order in json array have no sense
FROM moodys_table
, json_populate_recordset(NULL::json_col_type, json_col) data
, json_populate_recordset(NULL::btype, "B") data2

;

ROLLBACK;

postgres=# \i /tmp/moodys.sql 
psql:/tmp/moodys.sql:1: NOTICE:  table "moodys_table" does not exist, skipping
DROP TABLE
BEGIN
CREATE TABLE
INSERT 0 1
INSERT 0 1
CREATE TYPE
CREATE TYPE
┌────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ID │                                                             json_col                                                              │
╞════╪═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
│  1 │ [{"A":"foo11", "B":[{"C":"bar111", "D":"baz111"},{"C":"bar112", "D":"baz112"}]},{"A":"foo12","B":[{"C":"bar121", "D":"baz121"}]}] │
│  2 │ [{"A":"foo21", "B":[{"C":"bar211", "D":"baz211"}]}]                                                                               │
└────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(2 rows)

┌────┬───────┬────────┬────────┬─────────────┬──────┐
│ ID │   A   │   C    │   D    │ json_col_id │ b_id │
╞════╪═══════╪════════╪════════╪═════════════╪══════╡
│  1 │ foo11 │ bar111 │ baz111 │           1 │    1 │
│  1 │ foo11 │ bar112 │ baz112 │           1 │    2 │
│  1 │ foo12 │ bar121 │ baz121 │           2 │    1 │
│  2 │ foo21 │ bar211 │ baz211 │           1 │    1 │
└────┴───────┴────────┴────────┴─────────────┴──────┘
(4 rows)

ROLLBACK
0
ответ дан Jan Michálek 18 March 2019 в 12:23
поделиться

Посмотрите, поможет ли это:

WITH X AS
(
    SELECT 
        JSON_ARRAY_ELEMENTS(cod_proj::JSON) AS jsonelement
    FROM temp.kmltests
)
SELECT 
    ROW_NUMBER() OVER (ORDER BY jsonelement->>'A'),
    jsonelement->'A' AS A,

    -- Use a CASE to determine if B is a scalar value or an array.
    -- If B is a scalar value, simply access jsonelement->'B'

    JSON_ARRAY_ELEMENTS(jsonelement->'B')->'C' AS C,
    JSON_ARRAY_ELEMENTS(jsonelement->'B')->'D' AS D
FROM X xx
0
ответ дан Diego Victor de Jesus 18 March 2019 в 12:23
поделиться

Переработка ответа от @ diego-victor-de-jesus для добавления столбцов идентификаторов и добавления некоторых деталей.

Пусть моя таблица будет названа tbl:

  • json_array_elements() расширяет список json, повторяя значения из других столбцов,
  • ROW_NUMBER() OVER (PARTITION BY mycolumn) дает мне дополнительные идентификаторы в пределах группы.

Поскольку я хочу 2 разных IDs, мне нужно повторить эту последовательность 2 раза, снимая слой за раз.

SELECT 
ID, json_col_id,
ROW_NUMBER() OVER (PARTITION BY json_col_id) as B_id,
A,
B ->> 'C' AS C,
B ->> 'D' AS D
FROM
(SELECT 
ID, json_col_id, A,
JSON_ARRAY_ELEMENTS(B::JSON) AS B
FROM
(SELECT 
ID,
ROW_NUMBER() OVER (PARTITION BY ID) as json_col_id,
json_col ->> 'A' AS A,
json_col -> 'B' AS B
FROM 
(SELECT 
index,
JSON_ARRAY_ELEMENTS(json_col::JSON) AS json_col
FROM tbl
) AS expanded_json_col) AS extracted_json_col) as expanded_B"
0
ответ дан Moody_Mudskipper 18 March 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: