SQL:基于逻辑测试对行进行编号

时间:2014-06-01 16:13:15

标签: sql

我有一个VBA脚本,它根据日期和时间在csv文件中以递增方式对行进行编号。时间行(文件按日期排序,然后是时间),我想转换为SQL脚本,所以我可以直接在数据库中对行进行编号,但我不知道从哪里开始。

VBA脚本从头开始,如果日期和时间列相同,则为所有行分配相同的ID号,那么当日期或时间更改时,它会增加数字,依此类推:

Private Sub eventID()

Dim event As Integer
event = 0

For i = 2 To 112543
If (Sheet1.Cells.Item(i, 2) = Sheet1.Cells.Item(i - 1, 2)) And (Sheet1.Cells.Item(i, 3) =   Sheet1.Cells.Item(i - 1, 3)) Then
Sheet1.Cells.Item(i, 1) = event
Else
event = event + 1
Sheet1.Cells.Item(i, 1) = event
End If
Next i    
End Sub

如何在SQL Server 2012中执行此操作? 我只有一个表,并且eventID列当前为空(NULL)等待填写。

1 个答案:

答案 0 :(得分:3)

最好的方法是将数据加载到eventID声明为identity列的表中。这会在新数据输入时自动增加值。

如果无法做到这一点,您可以进行如下更新:

with toupdate as (
      select t.*, row_number() over (order by date, time) as seqnum
      from table t
     )
update toupdate
    set EventId = seqnum;

编辑:

如果日期/时间相同且您想要相同的号码,请使用dense_rank()代替row_number()

with toupdate as (
      select t.*, dense_rank() over (order by date, time) as seqnum
      from table t
     )
update toupdate
    set EventId = seqnum;