2016-11-24 1 views
0

Ich habe eine Tabelle wie unten in PostgreSQLSQL - add Spalte mit Autoinkrement über select

tabelle1
date_time    | make | model | miles | reg_no | age_months 
---------------------------------------------------------------------- 
2016-09-28 20:05:03.001 | toyota | prius | 10200 | 1111 | 22 
2016-09-28 20:05:03.001 | suzuki | sx4 | 10300 | 1122 | 12 
2016-09-28 20:03:03.001 | suzuki | sx4 | 11200 | 1133 | 34 
2016-09-28 20:02:03.001 | toyota | prius | 15200 | 1144 | 28 
2017-05-28 20:11:03.001 | toyota | prius | 15500 | 1144 | 36 

Ich brauche eine Spalte record_num, die für jeden Datensatz von 1 und Autoinkrement von 1 beginnt hinzuzufügen die Tabelle - Ich kann die Tabelle aufgrund von Berechtigungseinschränkungen nicht ändern, daher muss sie über select ausgeführt werden.

Die erwartete Ausgabe ist wie folgt.

table2
date_time    | make | model | miles | reg_no | age_months | record_num 
----------------------------------------------------------------------------------- 
2016-09-28 20:05:03.001 | toyota | prius | 10200 | 1111 | 22   | 1 
2016-09-28 20:05:03.001 | suzuki | sx4 | 10300 | 1122 | 12   | 2 
2016-09-28 20:03:03.001 | suzuki | sx4 | 11200 | 1133 | 34   | 3 
2016-09-28 20:02:03.001 | toyota | prius | 15200 | 1144 | 28   | 4 
2017-05-28 20:11:03.001 | toyota | prius | 15500 | 1144 | 36   | 5 
Edit:

Das Datum-Zeit ist in table1 nicht in Ordnung. Aber die record_num muss in der Reihenfolge wie in der table1 sein.

+3

Es gibt keine "Reihenfolge der Tabelle". Zeilen in einer relationalen Datenbank werden *** NICHT *** sortiert. Der *** nur *** (wirklich: der einzige) Weg, um eine bestimmte Reihenfolge zu erhalten, ist eine 'Order by' zu verwenden. –

+0

Überprüfen Sie meine Antwort. Ich denke, es passt zu Ihrer Bedingung –

Antwort

1

Verwenden Sie ein window function:

select date_time, 
     make, 
     model, 
     miles, 
     reg_no, 
     age_months, 
     row_number() over (order by date_time) as record_num 
from the_table 
order by date_time; 
+0

Die Reihenfolge von 'record_num' muss in der Reihenfolge der Daten in der ursprünglichen Tabelle sein -' table1' - Ich habe gerade die Frage bearbeitet – user3206440

+1

Ganz ok, aber row_number() over (order by some_column) wird nicht eindeutig sein, wenn diese Spalte nicht eindeutig ist - die gleichen Daten geben Ihnen die gleichen Zeilennummern ... Ich werde 'row_number() over()' und Unterabfrage mit der Reihenfolge nach Datum. – Jendrusk

+0

@Jendrusk: 'row_number()' ** wird ** immer eindeutige Zahlen zurückgeben. Sie verwechseln das mit 'rank()' oder 'dose_rank()'. Siehe hier: http://rextester.com/LSZ41415 –

-2

Verwendung row_number erzeugen Sequenz:

Select row_number() over(order by reg_no) Sno,* from Table1 

ODER

, wenn es keine eindeutige Spalte ist dann eine Sequenz erstellen und sie dann mit ausgewählten verwenden:

 CREATE SEQUENCE seq_person 
     MINVALUE 1 
     START WITH 1 
    INCREMENT BY 1 

    select NEXT VALUE FOR seq_person AS FirstUse,* from table1 
+0

'wählen NEXT VALUE FOR seq_person' ist ungültig für Postgres –

+0

ja ich weiß das. Sie googeln nur, dass, wie Sie in postgresql Sequenz erstellen –

Verwandte Themen