excel 单元格引用的复制功能(或多个视图的计算)
Replicating functionality of excel cell referencing (or calculations over multiple views)
我有一个包含 3 列的 table,其中包含多个数据流,全部在一个 table 中。
val_name
是数据流的名称,val_sequence
是递增的序列号,val
包含数据。组合 name
和 sequence
就像一个复合索引。
此table中现有的val_name
个流是a、b。我希望用户能够请求流 c(不在 table 中),并且数据库能够动态地请求 return a*b。
a*b 在这种情况下就像乘以两个 tables,一个只包含 val_name
a,另一个 val_name
b,然后加入 val_sequence
(很像乘索引 python pandas 系列)。
所以结果是:
val_sequence val_name val
0 c 80
1 c 5
想法是用户应该能够请求 a 或 b 或 c 并接收数据,而无需知道 a 和 b 保存数据,而 c 仅保存引用。中间或两端可能缺少一些序列号。
我还没有找到提供这种灵活性的好方法。 SQL 视图是否足够灵活?如果是这样,你能给我一个简单的例子吗?如果不是,什么可能是可行的替代方案?您选择的任何数据库引擎都可以。
为方便起见,我提供了 SQL 代码来创建 table 并插入以上值,并创建两个视图。这并不能满足我的需要,但对于那些想要尝试的人来说,这是一个开始。
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" ;
如果,正如您所建议的那样,保证两个流的序列号相同,即当且仅当 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
是否提供 "leading" 序列号,或者如果 val
应该假设为 0
丢失序列数字等..
我有一个包含 3 列的 table,其中包含多个数据流,全部在一个 table 中。
val_name
是数据流的名称,val_sequence
是递增的序列号,val
包含数据。组合 name
和 sequence
就像一个复合索引。
此table中现有的val_name
个流是a、b。我希望用户能够请求流 c(不在 table 中),并且数据库能够动态地请求 return a*b。
a*b 在这种情况下就像乘以两个 tables,一个只包含 val_name
a,另一个 val_name
b,然后加入 val_sequence
(很像乘索引 python pandas 系列)。
所以结果是:
val_sequence val_name val
0 c 80
1 c 5
想法是用户应该能够请求 a 或 b 或 c 并接收数据,而无需知道 a 和 b 保存数据,而 c 仅保存引用。中间或两端可能缺少一些序列号。
我还没有找到提供这种灵活性的好方法。 SQL 视图是否足够灵活?如果是这样,你能给我一个简单的例子吗?如果不是,什么可能是可行的替代方案?您选择的任何数据库引擎都可以。
为方便起见,我提供了 SQL 代码来创建 table 并插入以上值,并创建两个视图。这并不能满足我的需要,但对于那些想要尝试的人来说,这是一个开始。
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" ;
如果,正如您所建议的那样,保证两个流的序列号相同,即当且仅当 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
是否提供 "leading" 序列号,或者如果 val
应该假设为 0
丢失序列数字等..