我在 Postgres 表中有一个列,其值具有以下模式。
INPUT-X
INPUT-X-Y
INPUT-X-Y-Z
INPUT-X-Y-Z-A-...
我正在尝试计算 COLUMN 中的条目数,其中值以
INPUT
开头,并包含给定数量的 hyphens
。因此,如果输入值为 2023-08-04T09:00:32.822+00:00
,我想计算 COLUMN 中以 2023-08-04T09:00:32.822+00:00
开头并包含 3
连字符的所有条目。如果 COLUMN 中的值包括:
2023-08-04T09:00:32.822+00:00-1
2023-08-04T09:00:32.822+00:00-1-1
2023-08-04T09:00:32.822+00:00-2
2023-08-04T09:00:32.822+00:00-2-1
2023-08-04T09:00:32.822+00:00-3
2023-08-04T09:00:32.822+00:00-4
此操作的计数应等于
4
。 (这样做的目的是计算该系列的下一个值的索引,在本例中为 2023-08-04T09:00:32.822+00:00-5
。每个值都是对父条目的引用,例如 2023-08-04T09:00:32.822+00:00-5
表示对条目 的第 5 个回复) 2023-08-04T09:00:32.822+00:00
。同样,2023-08-04T09:00:32.822+00:00-2-3
表示对条目的第三次回复2023-08-04T09:00:32.822+00:00-2
。)
我当前使用的代码是:
select count(*) from messages_dev where ref like input || '%-' || repeat('-', hyphens) || '%' into result;
但是返回 0,因为计数应该有更高的数字。
有人可以推荐一种在 Postgres 中获取此计数的方法吗?
当你有一个字符串时,你可以使用字符串函数来获取下一个数字。
但最好不要以这种方式存储它,因为字符串函数通常非常慢,并且规范化的表结构更适合关系数据库
此查询将找到所有序列并获得最大的数字,如果您只想要特定的序列,则需要添加您想要的日期。
当你想在并行系统中使用它时,你应该阅读有关一致性的内容。
CREATE TABLE mytable
("mycolumn" varchar(33))
;
INSERT INTO mytable
("mycolumn")
VALUES
('2023-08-04T09:00:32.822+00:00-1'),
('2023-08-04T09:00:32.822+00:00-1-1'),
('2023-08-04T09:00:32.822+00:00-2'),
('2023-08-04T09:00:32.822+00:00-2-1'),
('2023-08-04T09:00:32.822+00:00-3'),
('2023-08-04T09:00:32.822+00:00-4')
;
WITH CTE AS (select Substring(mycolumn,0,30) datetxt,MAX(split_part(mycolumn, '-', 4))::int + 1 newnum
FROM mytable
GROUP BY 1)
SELECT CONCAT(datetxt,'-', newnum::text)
FROM CTE
连接 |
---|
2023-08-04T09:00:32.822+00:00-5 |