0

这是我的桌子:

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

我在看这个:SQL Server 中 for-loop 的语法 和这个SQL:更新 ID;根据日期,但没有到达那里。

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

为了清楚起见,我不能使用 alter table IDENTITY(1,1)。

这是在使用 SQL Server 时。

通过使用,dense_rank() 而不是 BlueFeet 建议的 row_number() 解决。

4

3 回答 3

2

根据您使用的数据库产品,您可能可以应用 arow_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

于 2013-03-18T12:21:07.130 回答
0

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

  1. 获取最短日期

    从您的表格中选择分钟(日期)

  2. 更新你的身份证

    更新您的表集 myid = DBMS_SPECIFIC_FUNCTION_DATE_DIFF(min_date, date) + 1

于 2013-03-18T12:13:47.823 回答
0

您没有说明您正在使用什么 RDBMS。但是,如果是 MySQL,您可以这样做:

update yourtable set myid=extract(day from date);

当然,这是假设 MyID 列应该等于日期的日期部分。

于 2013-03-18T12:19:07.747 回答