2012-03-08 49 views
0

我有一個表:使用「在組中的位置」列將值插入新表中?

c1  c2 c3 
---------- 
100 200 
100 201 
100 203 
200 405 
200 408 

...和3列創建另一個表。

我需要從上表中的值相加到新表,包括一個新列一樣,

c1  c2 c3 
-------------- 
100 200 1 
100 201 2 
100 203 3 
200 405 1 
200 408 2 

...等等。 c3依賴於c1,並且當c1更改時,它將被設置爲1並繼續增加。

第二張桌子被創建並且是空的。
我需要將舊錶的列c1c2的值複製到新表中,同時將新值插入第二個表的c3

+1

應該有'c3'第一個表或者是那只是一個錯字?你使用哪個數據庫? – 2012-03-08 04:51:03

+0

它與c3 – user1253754 2012-03-08 04:51:50

+0

沒有任何關係......它將從第一個現有表填充到新的表中......就像使用新值遷移到c3所添加的那樣 – user1253754 2012-03-08 04:54:15

回答

3
insert into my_table2 
    select c1, c2 
     ,row_number() over (partition by c1 order by c1, c2) 
    from my_table 
+0

很適合SQL Server,但並不是所有的數據庫都支持'row_number()等效於...' – 2012-03-08 05:05:05

+1

@pst:PostgreSQL(8.4+)支持窗口函數,我非常肯定Oracle和DB/2也支持它們。 – 2012-03-08 05:35:43

+0

@ muistooshort我只需要拿出一個反例就可以了:輸入... MySQL [或SQLite]! :-)(在這種特殊情況下,我認爲可以應用標準的MySQL黑客。) – 2012-03-08 09:44:27

2

這應該是你所需要的:

示例模式

 
CREATE TABLE test (
    c1 INT NOT NULL, 
    c2 INT NOT NULL 
); 

INSERT INTO TEST VALUES 
(100, 200), (100, 201), (100, 203), (200, 405), (200, 408) 

查詢

 
SELECT T1.C1, T1.C2, COUNT(*) AS C3 
FROM test T1 
JOIN test T2 ON T1.C1 = T2.C1 AND T1.C2 >= T2.C2 
GROUP BY T1.C1, T1.C2 
+0

我很喜歡它是否喜歡它:這很酷,並且解決了pst的問題。但另一方面,笛卡爾產品在sql世界中有些詛咒:) – Glenn 2012-03-08 05:28:15

+0

在純SQL中,我無法找到更好的方式(但仍期待) – 2012-03-08 05:31:21

+0

這很好:)我不知道該怎麼做,要麼。 Rownums非常有用。分析行號可以在Postgresql和Oracle中使用。 Oracle已經內置在rownum中。你可以僞造rownums。所以希望它可以在有問題的rdbms上使用。但是,這工作。 – Glenn 2012-03-08 05:38:43

相關問題