如何在SQL中添加序列/顺序数据
我正在尝试向我的原始数据中添加一个序列顺序,我想知道是否有一种有效的方法可以在不使用whileexists循环的情况下实现这一点,因为我有超过百万条记录要排序 示例数据集:如何在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
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