SQL:创建一个基于其他三列值更改的新id列?

时间:2014-10-20 23:47:08

标签: sql sql-server

我有一个包含三列的表格,其中包括cidorderdatepriororderdate等。

以下是表格的外观:

cid  orderdate            priororderdate              position 
12   NULL                  NULL                           1
12   NULL                  NULL                           2
12   NULL                  NULL                           3
12   2014-08-08 23:25      NULL                           1
12   2014-08-08 23:25      NULL                           2
12   2014-08-08 23:25      NULL                           3
12   2014-08-08 23:25      NULL                           4
12   2014-09-06 17:19      2014-08-08 23:25               1
12   2014-09-06 17:19      2014-08-08 23:25               2
12   2014-09-06 17:19      2014-08-08 23:25               3
13   NULL                  NULL                           1
13   NULL                  NULL                           2
13   NULL                  NULL                           3

cidorderdatetimepriororderdatetime的组合定义了唯一的fpid(我想要创建的新列)。因此,最终结果将是:

cid  orderdate            priororderdate              position       fpid
12   NULL                  NULL                           1            1
12   NULL                  NULL                           2            1
12   NULL                  NULL                           3            1
12   2014-08-08 23:25      NULL                           1            2
12   2014-08-08 23:25      NULL                           2            2
12   2014-08-08 23:25      NULL                           3            2
12   2014-08-08 23:25      NULL                           4            2
12   2014-09-06 17:19      2014-08-08 23:25               1            3
12   2014-09-06 17:19      2014-08-08 23:25               2            3
12   2014-09-06 17:19      2014-08-08 23:25               3            3
13   NULL                  NULL                           1            4
13   NULL                  NULL                           2            4
13   NULL                  NULL                           3            4

如何创建fpid列?

2 个答案:

答案 0 :(得分:2)

您可以使用dense_rank()查询中的select执行此操作:

select t.*,
       dense_rank() over (order by cid, orderdate, priororderdate) as fpid
from table t;

如果表格中已有列fpid,并且想要更新它:

with toupdate as (
      select t.*,
             dense_rank() over (order by cid, orderdate, priororderdate) as new_fpid
      from table t
     )
update toupdate
    set fpid = new_fpid;

(如果要添加它,可以使用alter table语句。)

答案 1 :(得分:1)

你说fpid是唯一的,但看着你想要的输出,看起来你想要使用ROW_NUMBER(),这有点混乱。

UPDATE tab2 t SET fpid =
(SELECT ROW_NUMBER () OVER (ORDER BY cid)
FROM tab2
GROUP BY cid, orderdate, priororderdate
WHERE t.cid = cid
AND t.orderdate = orderdate
AND t.priororderdate = priororderdate)