-3

我创建表格

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

4

4 回答 4

1

为什么需要一段文本 (variing(15)) 作为标识符?通常使用从序列中获取下一个数字的数字。使用数据类型 SERIAL,这一切都为您处理,请参阅手册

您也可以使用 MAX() 来获得最大的数字,但永远不要尝试将其用作“下一个数字”,因为这不起作用。可能还有其他人在同一个号码上工作......

于 2012-07-05T04:53:18.510 回答
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];
于 2012-07-05T06:28:55.357 回答
0
select max(
       substring(
                 identifier, 
                 position('/' in identifier) + 1, 
                 length(identifier) - position('/' in identifier)
                )::integer
      )

我知道它不是那么漂亮。

于 2012-10-25T10:39:49.753 回答
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')。

如果它是数字的,您也可以将标识符动态转换为 int:

select 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]*)$'));
于 2012-07-05T05:09:34.873 回答