Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过将id分配给物化视图来配对长字符串_Sql_Postgresql - Fatal编程技术网

Sql 通过将id分配给物化视图来配对长字符串

Sql 通过将id分配给物化视图来配对长字符串,sql,postgresql,Sql,Postgresql,我试图用ID替换大字符串(几百个字符),以创建一个简单的物化视图配对序列,而不需要保留原始字符串。我在PostgreSQL中创建了一个子查询,其输出类似于下面的示例(为了简单起见,使用缩写字符串): 我试图将其浓缩成如下所示: feat_uniquename | segment1 | segment2 | segment3 -----------------+---------------------+---------- SEQ000001.1 | 1 | 1

我试图用ID替换大字符串(几百个字符),以创建一个简单的物化视图配对序列,而不需要保留原始字符串。我在PostgreSQL中创建了一个子查询,其输出类似于下面的示例(为了简单起见,使用缩写字符串):

我试图将其浓缩成如下所示:

 feat_uniquename | segment1 | segment2 | segment3 
-----------------+---------------------+----------
 SEQ000001.1     | 1        | 1        | 1
-----------------+---------------------+----------
 SEQ000001.2     | 2        | 2        | 1  
-----------------+---------------------+----------
 SEQ000001.3     | 3        | 2        | 1  
-----------------+---------------------+----------
 SEQ000001.4     | 4        | 1        | 1

在物化视图中保留长字符串可能会导致内存效率低下,并且行关联速度可能较慢,但我不知道如何仅使用SQL继续。如果不使用迭代过程(在SQL中也可能吗?),似乎不可能链接这些值。作为最后一种手段,我可以使用Python字典压缩字符串,写入分隔文本文件,然后解析以创建物化视图。

如果只有三列这样的数据,可以通过将每个唯一值映射到任意索引来创建查找表,然后在每次查找时加入表并选择索引列。比如说,

WITH lookup1 AS (SELECT DISTINCT
    segment1,
    row_number() over(partition by segment1) as index1
)

SELECT
    feat_uniquename,
    index1
FROM
    original_table t1
INNER JOIN
    lookup1 t2
ON t1.segment1 = t2.segment1

好主意,但是当一个新密码子被添加到数据集中时会发生什么呢?或者是否应该从数据集中删除一个密码子?我会尝试一下。我计划在数据集更改时重新创建物化视图。谢谢更新:行分区接近我想要的,但我最终使用了行计数。我投票赞成保留序列的当前状态。毕竟,它代表了您的实际数据。试图将它们映射到数字序列存在各种各样的陷阱。
WITH lookup1 AS (SELECT DISTINCT
    segment1,
    row_number() over(partition by segment1) as index1
)

SELECT
    feat_uniquename,
    index1
FROM
    original_table t1
INNER JOIN
    lookup1 t2
ON t1.segment1 = t2.segment1