Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
如何在postgresql中添加条件值大于1的字母表?_Sql_Postgresql - Fatal编程技术网

如何在postgresql中添加条件值大于1的字母表?

如何在postgresql中添加条件值大于1的字母表?,sql,postgresql,Sql,Postgresql,我想在no_surat的末尾添加字母表,但根据条件,它在account字段中有超过1个相同的值,如果account只有1个值,它将不会添加字母表 我已经尝试过这个查询,但它也向帐户添加了一个字母表,该帐户只有1个值,如帐户编号335,一个帐户只有1个值,如355,应该没有添加的字母表帐户335应该没有\u suratABC编号SKF.161 SELECT ACCOUNT, NO_SURAT, no_suratABC FROM (SELECT *, concat((NO_SURAT) ,

我想在no_surat的末尾添加字母表,但根据条件,它在account字段中有超过1个相同的值,如果account只有1个值,它将不会添加字母表

我已经尝试过这个查询,但它也向帐户添加了一个字母表,该帐户只有1个值,如帐户编号335,一个帐户只有1个值,如355,应该没有添加的字母表帐户335应该没有\u suratABC编号SKF.161

SELECT ACCOUNT, NO_SURAT, no_suratABC 
 FROM 
 (SELECT *, concat((NO_SURAT) , CHR(64 + CAST ( row_number() OVER(PARTITION BY ACCOUNT_NUMBER   order by ACCOUNT_NUMBER) AS integer ))) AS No_suratABC 
FROM 
 (SELECT DISTINCT ON (ADDRESS) * FROM account_information) a) b;
我有这个数据记录

|account   |    no_surat  | no_suratABC|
|-----     |    ------    |      ----- |
|337       |    No.SKF.6  | No.SKF.6A  |
|337       |    No.SKF.5  | No.SKF.5B  |
|337       |    No.SKF.4  | No.SKF.4C  |
|335       |    No.SKF.161| No.SKF.161A|
|184       |    No.SKF.105| No.SKF.105A|
|184       |    No.SKF.71 | No.SKF.71B |
关于我应该如何添加到查询中的任何建议?

您可以使用此处的行号选择出现的字母:

以cte为例 在地址*上选择DISTINCT, 按帐户顺序划分的分区上的行数,按编号说明, 按帐户cnt划分的分区上的计数* 从帐户信息 选择帐户,无需额外付款, cnt>1时的情况 然后CONCATNO_SURAT,将rn::int中的“abcdefghijklmnopqrstuvxyz”子串用作1 除此之外,没有其他原因 来自cte;
上面使用的技巧是取字母字符串abcdefghijklmnopqrstuvxyz的1长度子字符串,使用行号决定选择哪个字母。请注意,我在这里假设您永远不需要Z以外的字母标签,它假设每个帐户关联的记录不会超过26条。

您的基本方法很好。只要修改语法并加入逻辑就可以了。你所描述的是:

SELECT ACCOUNT, NO_SURAT,
       (CASE WHEN COUNT(*) OVER (PARTITION BY ACCOUNT) > 1
             THEN NO_SURAT || (CHR(64 + CAST (ROW_NUMBER() OVER (PARTITION BY ACCOUNT ORDER BY ACCOUNT)::int)
             ELSE NO_SURAT
        END) as No_suratABC
FROM account_information;
但是,您的示例数据表明您需要:

SELECT ACCOUNT, NO_SURAT,
       (NO_SURAT || CHR(64 + ROW_NUMBER() OVER (PARTITION BY ACCOUNT ORDER BY ACCOUNT)::int)) as No_suratABC
FROM account_information;

是一个数字小提琴。

哪些字母应该出现在Z之后的序列中?我们只需要考虑Z,记住“不”和“不能”之间的区别。作为设计师/开发人员,你工作的一部分是系统地控制不可能发生的事情,因为它们可以,我得到了错误>错误:函数pg_catalog.substringunknown,bigint,integer不存在exist@omik尝试将行号强制转换为整数,即使用FROM rn::int表示1,q.v.上面更新的答案。它仍在为只有1个值的帐户添加字母表。我为此添加了一个修复,虽然你在最初的问题中从未提到过这个要求。