2012-03-08 48 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

相关问题