2016-11-24 91 views
0

,支持自動增量加列我有一個表像下面PostgreSQL中SQL - 通過選擇

table1的
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 

我需要添加從1和經銷商的增量開始以1爲每個記錄到列record_num表格 - 由於權限限制,我無法更改表格,所以需要通過select操作完成。

預期輸出如下。

表2
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 
編輯:

的日期 - 時間是不是爲了在table1。但record_num需要按table1中的順序排列。

+3

沒有「表格的順序」這樣的東西。關係數據庫中的行不是***排序的。只有***(真的:唯一的)獲得特定訂單的方法是使用'order by'。 –

+0

檢查我的答案。我認爲它適合你的條件 –

回答

1

使用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

'record_num'的順序需要按照原始表中的數據順序 - 'table1' - 我剛剛編輯了問題 – user3206440

+1

非常好,但是row_number()over(按some_column排序)如果此列不唯一 - 將不會是唯一的 - 相同的日期將爲您提供相同的row_number ...我將根據日期順序獲取'row_number()over()'和子查詢。 – Jendrusk

+0

@Jendrusk:'row_number()** **將總是返回唯一的數字。你用'rank()'或'dense_rank()'混淆了這個問題。請參閱此處:http://rextester.com/LSZ41415 –

-2

使用ROW_NUMBER生成序列:

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

OR

如果沒有唯一列,然後創建一個序列,然後用選擇使用它:

 CREATE SEQUENCE seq_person 
     MINVALUE 1 
     START WITH 1 
    INCREMENT BY 1 

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

'select seq_person'的下一個值對Postgres無效 –

+0

是的,我知道這一點。你只是谷歌,如何在postgresql中創建序列 –