【问题标题】:SQL - ID to date, multiple datesSQL - 迄今为止的 ID,多个日期
【发布时间】:2013-03-06 18:28:37
【问题描述】:

这是我的桌子:

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 时。

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

【问题讨论】:

  • 请通过添加适当的标签(Oracle、SQL Server、MySQL 等)指定您的目标关系数据库管理系统。可能有一些答案利用了不受普遍支持的语言或产品功能。此外,通过使用特定的 RDBMS 对其进行标记,您的问题可能会受到更适合回答的人的关注。

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


【解决方案1】:

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

【讨论】:

  • 已经尝试过此解决方案,但由于多个事务时将行号添加到同一日期而遇到问题。那是当日期 SSN MyId 01012013 1234 1 01012013 1234 2
  • @AceAlfred 那么您将在同一日期进行多笔交易?
  • 是的,有时在为不同的工作写小时数时。
  • @AceAlfred 如果日期相同,每个日期的MyID 值是否必须相同?
  • 是的,每个日期的 MyID 必须相同
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    1. 获取最短日期

      从您的表格中选择 min(date)

    2. 更新你的身份证

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2011-01-26
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多