Репликация функциональности ссылок на ячейки Excel (или расчетов по нескольким представлениям) - PullRequest
0 голосов
/ 25 мая 2019

У меня есть таблица с 3 столбцами, которая содержит несколько потоков данных в одной таблице.

val_name - это имя потока данных, val_sequence - это увеличивающийся порядковый номер, а val содержит данные. Объединенные name и sequence подобны составному индексу.

enter image description here

Существующие val_name потоки в этой таблице являются a, b. Я бы хотел, чтобы пользователи могли запрашивать поток c (которого нет в таблице) и базу данных для динамического возврата a * b.

a * b в этом случае будет похоже на умножение двух таблиц, одна из которых содержит только val_name a, другая val_name b, а затем объединяется в val_sequence (во многом как умножение индексированных рядов панд питона).

Таким образом, результаты будут:

val_sequence val_name val 
0            c        80
1            c        5

Идея состоит в том, что пользователи должны иметь возможность запрашивать a или b или c и получать данные без необходимости знать, что a и b содержат данные, а c содержит только ссылки. возможно, что некоторые порядковые номера отсутствуют как в середине, так и на любом конце.

Я не смог придумать, как обеспечить такую ​​гибкость. Достаточно ли гибки представления SQL для этого? И если да, не могли бы вы привести простой пример? Если нет, что может быть работоспособной альтернативой? Любой двигатель базы данных на ваш выбор в порядке.

Для удобства я предоставляю код SQL, который создает таблицу и вставляет указанные выше значения, а также создает два представления. Это не делает то, что мне нужно, но это начало для тех, кто хочет попробовать.

CREATE TABLE  IF NOT EXISTS valdb (
  val_name VARCHAR(255), 
  val INT, 
  val_sequence  int
);

INSERT into valdb (val_name, val, val_sequence) VALUES ("a",10,0);
INSERT into valdb (val_name, val, val_sequence) VALUES ("a", 1,1);

INSERT into valdb (val_name, val, val_sequence) VALUES ("b", 8,0);
INSERT into valdb (val_name, val, val_sequence) VALUES ("b", 5,1);

CREATE VIEW `a` AS SELECT val_name, val, val_sequence from valdb WHERE val_name = "a" ;
CREATE VIEW `b` AS SELECT val_name, val, val_sequence from valdb WHERE val_name = "b" ;

1 Ответ

1 голос
/ 25 мая 2019

Если, как показывает пример, порядковые номера гарантированно будут одинаковыми для обоих потоков, то есть, если и только если есть выходы n для a и n такжесуществует для b, который будет внутренним объединением порядкового номера и оператором * для получения умножения.

CREATE VIEW c
AS
SELECT 'c' val_name,
       a.val_sequence,
       a.val * b.val val
       FROM a
            INNER JOIN b
                       ON a.val_sequence = b.val_sequence;

db <> fiddle (при условии, что MySQL изсинтаксис предоставленного вами кода)

Если предположение не выполняется, вам необходимо определить, что должно произойти в тех случаях, когда оно не выполняется.Например, получить ли следующий доступный порядковый номер, а a или b предоставляет «начальный» порядковый номер или если val следует считать равным 0 для отсутствующих порядковых номеров и т. Д.

...