【问题标题】:How can I add a sequence / order a data in SQL如何在 SQL 中添加序列/排序数据
【发布时间】:2018-10-03 01:11:55
【问题描述】:

我正在尝试将序列顺序添加到我的原始数据中,并且想知道是否有一种有效的方法可以在没有 while 存在循环的情况下执行此操作,因为我有超过一百万条记录要排序。

示例数据集:

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(startdate)、min(enddate)、min(enrollid) 为每个客户 id 添加一个序列/订单

最终输出数据集应如下所示,其中每个 customerID 记录按 min(StartDate)、min(EndDate)、min(EnrollID) 排序

CustomerID  StartDate   EndDate   EnrollID  Sequence_Order
----------------------------------------------------------
   1        1/1/1990    1/1/1991    14994       1
   1        1/1/1992    1/1/1993    14996       2
   1        1/1/1993    1/1/1994    14997       3
   2        1/1/1990    1/1/1992    14995       1
   2        1/1/1993    1/1/1995    14997       2
   2        1/1/1995    1/1/1996    14998       3
   3        1/1/1990    1/1/1991    15000       1
   3        1/1/1992    1/1/1993    15001       2
   3        1/1/1995    1/1/1996    15007       3

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

【问题讨论】:

  • 您可以分批完成还是需要一次性完成?插入新记录时会发生什么?可以添加索引吗?存在哪些索引?
  • 你可以在你的 SELECT 语句中使用 row_number() 来完成它

标签: sql database tsql sql-server-2014


【解决方案1】:

使用Row_number

select
    *, row_number() over (partition by CustomerID order by StartDate, EndDate, EnrollID) as Sequence_Order
from myTable

【讨论】:

    【解决方案2】:

    Order= ROW_NUMBER() OVER(ORDER BY 列)用于。试试下面的答案

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

    Reference

    【讨论】:

    • @SNW 试试这个答案
    • 非常感谢您的回复。我很感激。这需要 partition by 和 order by 来获取每个 customerID 的序列。
    【解决方案3】:

    使用ROW_NUMBER()

    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
    

    点击演示链接:

    http://sqlfiddle.com/#!18/dbe66/2

    【讨论】:

    • 这行得通!谢谢你!感谢您的帮助!
    【解决方案4】:

    试试这个:

    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才能对最终输出进行排序

    【讨论】:

    • 这很完美。 Partition by 和 Order by 都需要获得正确的行号,但只是想知道为什么我们也需要外部的第二个 order by?我在没有第二次订购的情况下尝试了它,并且效果很好。只是想知道我是否遗漏了什么。再次感谢您的回复。我很感激。
    • 订购不是强制性的。刚刚添加到排序最终结果。如果你愿意,你可以跳过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2023-02-21
    • 1970-01-01
    相关资源
    最近更新 更多