SQL - 迄今为止的ID,多个日期

时间:2013-03-18 12:07:58

标签: sql sql-server for-loop while-loop identity

这是我的表:

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 ServerSQL : Update ID; According to Date但是没有到达那里。

似乎是一项轻松的工作,但不知何故不能按预期工作。

我不能使用alter table IDENTITY(1,1)来清楚。

这是在使用SQL Server时。

使用,blue_etk()而不是blueFeet建议的row_number()解决。

3 个答案:

答案 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;

请参阅SQL Fiddle with Demo

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;

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

如果您的DBMS可以计算两个日期之间的差异,您可以使用以下

  1. 获取最短日期

    从yourtable选择min(date)

  2. 更新你的身份

    更新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列应该等于您日期的日期部分。