2017-06-02 5 views
0

Ich habe Tabelle wieSQL - Postgresql, erhöhe Spalte auf anderen Spalte basiert Werte

create table test(employee integer NOT NULL, code character varying(200), number integer) 

Ich möchte Autoinkrement Spalte ‚Anzahl‘ auf jedem Datensatz einfügen

insert into test(employee, code) values(17,'bangalore') 
insert into test(employee, code) values(17,'bangalore') 
insert into test(employee, code) values(17,'mumbai') 

ich führen möchte wie

employee code  number 
17   bangalore 1 
17   bangalore 2 
17   bangalore 3 
17   mumbai  1 
17   mumbai  2 
17   bangalore 4 
17   mumbai  3 
18   bangalore 1 
18   bangalore 2 
18   mumbai  1 
18   mumbai  2 
+0

Do ** nicht ** posten Code oder zusätzliche Informationen in Kommentaren. ** [Bearbeiten] ** Ihre Frage. –

+2

Warum möchten Sie diese Informationen speichern? Sie können diese Zahlen beim Abrufen der Daten einfach generieren. –

+0

Ich möchte speichern, da die gleichen Daten an mehreren Stellen referenziert werden –

Antwort

0
create table test (employee integer NOT NULL, code character varying(200), number integer) 

    insert into test(employee, code, number) values(17,'bangalore',(select coalesce(max(number) + 1,1) from test where employee = 17 and code = 'bangalore')); 
    insert into test(employee, code, number) values(17,'bangalore',(select coalesce(max(number) + 1,1) from test where employee = 17 and code = 'bangalore')); 
    insert into test(employee, code, number) values(17,'mumbai',(select coalesce(max(number) + 1,1) from test where employee = 17 and code = 'mumbai')); 
+0

Ich würde "max" anstatt "count" verwenden. Was passiert, wenn einige Zeilen gelöscht werden? –

+0

@LaurenzAlbe, ja du hast Recht. und wir müssen count (*) + 1 coalesce (max (number) + 1,1) ändern. –

+0

Dies funktioniert gut für einzelne einfügen, aber ich wollte für Batch-Update. –

0

Für eine Batch uploa d der Daten, versuchen Sie, wenn unten Ansatz wäre nützlich.

eine temporäre Tabelle erstellen test2

create table test2(employee integer NOT NULL, code character varying(200)) 

insert into test2(employee, code) values(17,'bangalore') 
insert into test2(employee, code) values(17,'bangalore') 
insert into test2(employee, code) values(17,'mumbai') 

in aktuelle Tabelle einfügen zusammen mit inkrementalen Zahl

insert into test(employee, code, number) 
select employee, code, row_number() over (partition by code) from test2 

Sie Auftrag von Klausel wie Primärschlüsselspalte oder eine andere Spalte wie created_date umfassen könnte:

over (partition by code order by created_date) 
Verwandte Themen