我创建了像
这样的表格CREATE TABLE dataset (
identifier character varying(15) NOT NULL,
description character varying(3000) NOT NULL,
publisher character varying(45) NOT NOT NULL,
publication_date date,
modification_date date,
title character varying(600) NOT NULL,
release_date date
)
如何选择最大标识符 例如
10001/01
10001/02
10001/03
10001/04
选择10001/04
答案 0 :(得分:1)
为什么你需要一段文字(不同的(15))作为标识符?通常使用一个从序列中获取下一个数字的数字。使用数据类型SERIAL,这一切都是为您处理的,请参阅manual。
您也可以使用MAX()来获取最大数字,但从未尝试将其用作“下一个数字”,因为这不起作用。可能有其他人正在使用相同的号码...
答案 1 :(得分:1)
像这样的东西
select parts[1], max(parts[2])
from (
select identifier,
regexp_split_to_array(identifier, '/')::int[] as parts
from dataset
) t
group by parts[1];
答案 2 :(得分:0)
你遇到了语法错误,第4行有NOT NOT NULL
。
如果“最大”意味着“最长”,那么这样的事情可能会帮助你:
select identifier from dataset order by length(identifier) desc limit 1;
如果你想要文本比较格式的“最大”项目(即“foo”>“bar”),那么使用MAX:
select max(identifier) from dataset;
如果标识符是字符串格式的数字,这也会有所帮助(警告......我曾经做过'-1'>'0',因为某些奇怪的语言环境设置......和'9'> '10' )。
如果数字为
,您也可以动态地将标识符强制转换为intselect max(identifier::int) from dataset;
如果希望比较斜线后的数字,请尝试以下信息:
select identifier from dataset
order by substring(identifier from '/([0-9]*)$')::int desc limit 1;
为了提高速度,您可以在子字符串表达式上添加索引:
create index dataset_by_substring on dataset
(substring(identifier from '/([0-9]*)$'));
答案 3 :(得分:0)
select max(
substring(
identifier,
position('/' in identifier) + 1,
length(identifier) - position('/' in identifier)
)::integer
)
我知道它不是那么漂亮。