Sql 如何仅为连续组合提供行号
我只想给以连续方式出现的组合指定行号,如, 请指导如何在Tsql中获取这种类型的序列号 我试过了Sql 如何仅为连续组合提供行号,sql,sql-server,tsql,teradata,Sql,Sql Server,Tsql,Teradata,我只想给以连续方式出现的组合指定行号,如, 请指导如何在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
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
将行号与CTE一起使用。查询的基础是,如果存在连续值,则按记录排序的行数与按名称划分的行数不同,则按记录排序的OrderType ORDER将保持不变
像这样的
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;
试试这个:
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
您在哪一列排序此数据?是否有另一列如date?是的,有另一列如REC\TS,其中包含订单日期和时间忘记行号。结果排序是什么?表没有固有的顺序。您需要按顺序对结果进行列和排序。我希望生成的序号与结果集中给定的序号相同。如何查询此表以获得该结果?@Blam-我相信OP想要的是,当数据根据记录排序时,如果前一行具有相同的名称和顺序类型,则顺序应递增1,否则它应从1重新开始。这就是我制定解决方案的基础。非常感谢。正是我想要的。