如何在SQL中添加序列/顺序数据

如何在SQL中添加序列/顺序数据,sql,database,tsql,sql-server-2014,Sql,Database,Tsql,Sql Server 2014,我正在尝试向我的原始数据中添加一个序列顺序,我想知道是否有一种有效的方法可以在不使用whileexists循环的情况下实现这一点,因为我有超过百万条记录要排序 示例数据集: CustomerID StartDate EndDate EnrollID ------------------------------------------- 1 1/1/1990 1/1/1991 14994 2 1/1/1990 1/1/1992

我正在尝试向我的原始数据中添加一个序列顺序,我想知道是否有一种有效的方法可以在不使用whileexists循环的情况下实现这一点,因为我有超过百万条记录要排序

示例数据集:

CustomerID  StartDate   EndDate    EnrollID
-------------------------------------------
  1         1/1/1990    1/1/1991    14994
  2         1/1/1990    1/1/1992    14995
  2         1/1/1993    1/1/1995    14997
  1         1/1/1992    1/1/1993    14996
  1         1/1/1993    1/1/1994    14997
  2         1/1/1995    1/1/1996    14998
  3         1/1/1990    1/1/1991    15000
  3         1/1/1992    1/1/1993    15001
  3         1/1/1995    1/1/1996    15007
重新订购的数据应根据min(开始日期)、min(结束日期)、min(注册id)为每个客户id添加序列/订单

最终输出数据集应如下所示,其中每个customerID记录按min(开始日期)、min(结束日期)、min(注册ID)排序

需要在T-SQL中以最快的方式执行此操作

Order=ROW_NUMBER()OVER(按列排序)用于。试试下面的答案

SELECT  (Order= ROW_NUMBER() OVER ( ORDER BY CustomerID)) as Sequence ,
    CustomerID,
     StartDate,
     EndDate,
     EnrollID
     FROM    dbo.SomeTable

使用
行号()

输出:

CustomerID  StartDate   EndDate EnrollID    Sequence_Order
1   1990-01-01  1991-01-01  14994   1
1   1992-01-01  1993-01-01  14996   2
1   1993-01-01  1994-01-01  14997   3
2   1990-01-01  1992-01-01  14995   1
2   1993-01-01  1995-01-01  14997   2
2   1995-01-01  1996-01-01  14998   3
3   1990-01-01  1991-01-01  15000   1
3   1992-01-01  1993-01-01  15001   2
3   1995-01-01  1996-01-01  15007   3
按照演示的链接进行操作:

试试这个:

SELECT customerId, startDate, endDate, enrollID,
ROW_NUMBER() OVER(
     PARTITION BY customerId 
     ORDER BY startDate
              ,endDate 
              ,enrollID
) AS seq
FROM Table1
ORDER BY customerId 
     ,startDate
     ,endDate 
     ,enrollID

最终需要Order by对最终输出进行排序

您可以分批完成,还是需要一次完成?插入新记录时会发生什么情况?你能添加索引吗?存在哪些索引?您可以在您的
选择
语句中使用
行号()
@SNW尝试这个答案谢谢您的回复。我很感激。这需要分区依据和排序依据来获得每个customerID的序列。这非常好用。Partition by和Order by都需要获得正确的行号,但我只是想知道为什么我们也需要外部的第二个Order by?我在没有第二次点菜的情况下试了一下,效果很好。只是想知道我是否错过了什么。再次感谢您的回复。我很感激。不强制订货。刚刚添加到排序的最终结果。如果你愿意,你可以跳过它。这很有效!谢谢你,尼桑!谢谢你的帮助!
SELECT CustomerID, StartDate, EndDate, EnrollID,
ROW_NUMBER() OVER(
                  PARTITION BY CustomerId 
                  ORDER BY StartDate
                           ,EndDate 
                           ,EnrollID
                  ) AS Sequence_Order
FROM Table1
CustomerID  StartDate   EndDate EnrollID    Sequence_Order
1   1990-01-01  1991-01-01  14994   1
1   1992-01-01  1993-01-01  14996   2
1   1993-01-01  1994-01-01  14997   3
2   1990-01-01  1992-01-01  14995   1
2   1993-01-01  1995-01-01  14997   2
2   1995-01-01  1996-01-01  14998   3
3   1990-01-01  1991-01-01  15000   1
3   1992-01-01  1993-01-01  15001   2
3   1995-01-01  1996-01-01  15007   3
SELECT customerId, startDate, endDate, enrollID,
ROW_NUMBER() OVER(
     PARTITION BY customerId 
     ORDER BY startDate
              ,endDate 
              ,enrollID
) AS seq
FROM Table1
ORDER BY customerId 
     ,startDate
     ,endDate 
     ,enrollID