pgsql选择表中最大的项

时间:2012-07-05 04:19:49

标签: sql postgresql

我创建了像

这样的表格
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 个答案:

答案 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' )。

如果数字为

,您也可以动态地将标识符强制转换为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]*)$'));

答案 3 :(得分:0)

select max(
       substring(
                 identifier, 
                 position('/' in identifier) + 1, 
                 length(identifier) - position('/' in identifier)
                )::integer
      )

我知道它不是那么漂亮。