-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

識別子としてテキスト (varying(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 に答える