【问题标题】:how to give row number only for consecutive combination如何仅为连续组合提供行号
【发布时间】:2015-07-01 16:37:14
【问题描述】:

我只想在组合以连续方式出现时为组合提供行号,例如, 请指导如何在 Tsql 中获取这种类型的序列号

我试过了

ROW_NUMBER() Over (Partition by name,Order_type Order by REC_TS)
where record REC_TS is the time of order.



 Name:  Order type:     Seq Number:

    AAA     ONLINE  1

    AAA     ONLINE  2

    AAA     STORE   1

    AAA     SPOT    1

    AAA     STORE   1

    AAA     SPOT    1

    AAA     SPOT    2

    AAA    ONLINE   1

【问题讨论】:

  • 您在哪一列订购这些数据?还有像日期这样的列吗?
  • 是的,还有另一列 REC_TS,其中包含订购日期和时间
  • 忘记行号。什么是排序结果?表没有内在的顺序。您需要对结果进行列和排序。
  • 我希望生成的序列号与结果集中给出的序列号一样。如何查询该表以获得该结果?
  • @Blam - 我相信 OP 想要的是根据REC_TS 对数据进行排序,如果前一行具有相同的名称和 order_type,则序列应增加 1,否则应从 1 重新开始. 这是我制定解决方案的基础

标签: sql sql-server tsql teradata


【解决方案1】:

ROW_NUMBER() 与 CTE 一起使用。该查询基于当存在连续值时,ROW_NUMBER () OVER (ORDER BY REC_TS)ROW_NUMBER () OVER (PARTITION BY Name, OrderType ORDER BY REC_TS) 之间的差异将保持不变。

类似的东西

DECLARE @Table1 TABLE
(
    Name VARCHAR(10),
    OrderType VARCHAR(10),
    REC_TS DATETIME
)

Insert into @Table1
SELECT 'AAA','ONLINE','2014-09-01'
UNION ALL SELECT 'AAA','ONLINE','2014-09-02'
UNION ALL  SELECT 'AAA','STORE','2014-09-03' 
UNION ALL SELECT  'AAA','SPOT','2014-09-04'
UNION ALL SELECT  'AAA','STORE','2014-09-05'
UNION ALL SELECT  'AAA','SPOT','2014-09-06'
UNION ALL SELECT  'AAA','SPOT','2014-09-07'
UNION ALL SELECT  'AAA','ONLINE','2014-09-07'


;WITH CTE
AS (SELECT *, 
ROW_NUMBER () OVER (ORDER BY REC_TS) - ROW_NUMBER () OVER (PARTITION BY Name, 
            OrderType
            ORDER BY REC_TS) AS RowGroup
FROM @Table1) 
SELECT ROW_NUMBER () OVER (PARTITION BY RowGroup, 
        Name, 
        OrderType
        ORDER BY REC_TS) AS Sequence, 
Name,OrderType
FROM CTE
ORDER BY REC_TS;

【讨论】:

  • 非常感谢ughai。正是我想要的。
【解决方案2】:

试试这个:

CREATE TABLE Orders 
(
    Name VARCHAR(10),
    OrderType VARCHAR(10),
    REC_TS DATETIME
)

Insert into Orders
VALUES 
  ('AAA','ONLINE','2014-09-01'),
  ('AAA','ONLINE','2014-09-02'),
  ('AAA','STORE','2014-09-03'), 
  ('AAA','SPOT','2014-09-04'),
  ('AAA','STORE','2014-09-05'),
  ('AAA','SPOT','2014-09-06'),
  ('AAA','SPOT','2014-09-07'),
  ('AAA','ONLINE','2014-09-07')

;WITH OrdersRN
AS
(
    SELECT [Name], OrderType, ROW_NUMBER() OVER (ORDER BY [REC_TS]) AS RN, [REC_TS]
    FROM Orders 
),
OrdersRecurs 
AS
(
    SELECT O1.Name, O1.OrderType, 1 As Seq, O1.RN
    FROM OrdersRN O1
    WHERE RN = 1

    UNION ALL
    SELECT O1.Name, O1.OrderType, 
        CASE
            WHEN Prev.Name IS NULL THEN 1 
            WHEN Prev.Name = O1.Name AND Prev.OrderType = O1.OrderType THEN Prev.Seq + 1
            ELSE 1
        END As Seq, 
        O1.RN
    FROM OrdersRN O1
    INNER JOIN OrdersRecurs Prev
        ON Prev.RN = O1.RN - 1
    WHERE O1.RN <> 1

)
SELECT O.[Name], O.OrderType, O.[Seq]
FROM OrdersRecurs O

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 2017-10-01
    • 2016-03-21
    • 1970-01-01
    • 2015-09-19
    • 2022-10-07
    • 2015-07-30
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多