这是我的表:
Date SSSN MyID Hours
01012013 1234 8
01012013 2345 7
01012013 3456 8
02012013 1234 5
02012013 2345 12
02012013 3456 7
我想设置MyID,以便表格如下所示:
Date SSSN MyID Hours
01012013 1234 1 8
01012013 2345 1 7
01012013 3456 1 8
02012013 1234 2 5
02012013 2345 2 12
02012013 3456 2 7
我在看这个:Syntax of for-loop in SQL Server 这SQL : Update ID; According to Date但是没有到达那里。
似乎是一项轻松的工作,但不知何故不能按预期工作。
我不能使用alter table IDENTITY(1,1)来清楚。
这是在使用SQL Server时。
使用,blue_etk()而不是blueFeet建议的row_number()解决。
答案 0 :(得分:2)
根据您使用的数据库产品,您可以应用row_number()
来生成MyID
值:
;with cte as
(
select date, sssn, myid, hours,
row_number() over(partition by sssn order by date) rn
from yourtable
)
update cte
set myid = rn;
row_number()
函数在大多数现代RDBMS中都可用。
修改#1,因为您可以在每个日期拥有多行sssn
,所以您需要使用dense_rank
:
;with cte as
(
select date, sssn, myid, hours,
dense_rank() over(order by date) rn
from yourtable
)
update cte
set myid = rn;
答案 1 :(得分:0)
如果您的DBMS可以计算两个日期之间的差异,您可以使用以下
获取最短日期
从yourtable选择min(date)
更新你的身份
更新yourtable set myid = DBMS_SPECIFIC_FUNCTION_DATE_DIFF(min_date,date)+ 1
答案 2 :(得分:0)
您没有说明您正在使用的RDBMS。但是,如果它是MySQL,你可以这样做:
update yourtable set myid=extract(day from date);
当然,这假设MyID列应该等于您日期的日期部分。