2017-06-19 64 views

回答

0

在SQL Server的新版本,你可以使用LEAD()窗口功能,但之前的2012年,我认为实现这一目标的最简单的方法是用外适用:

DECLARE @T TABLE (Customer CHAR(1), [Date] DATE, Item VARCHAR(10)); 

INSERT @T VALUES 
('A', '2016-01-01', 'Pen A'), 
('A', '2016-01-05', 'Pen B'), 
('A', '2016-01-06', 'Pen C'), 
('A', '2016-01-07', 'Pen D'), 
('B', '2016-01-01', 'Pen A'), 
('B', '2016-01-05', 'Pen B'), 
('B', '2016-01-06', 'Pen C'), 
('B', '2016-01-07', 'Pen IS'); 

SELECT T.Customer, 
     T.FirstOrderedDate, 
     T.FirstOrderedItem, 
     T.SecondOrderedDate, 
     T.SecondOrderedItem, 
     ThirdOrderedDate = T3.[Date], 
     ThirdOrderedItem = T3.Item 
FROM 
(
    SELECT T1.Customer, 
      FirstOrderedDate = T1.[Date], 
      FirstOrderedItem = T1.Item, 
      SecondOrderedDate = T2.[Date], 
      SecondOrderedItem = T2.Item 
    FROM @T AS T1 
    OUTER APPLY 
    (
     SELECT TOP 1 T2.Customer, T2.[Date], T2.Item 
     FROM @T AS T2 
     WHERE T2.Customer = T1.Customer 
     AND T2.[Date] > T1.[Date] 
     ORDER BY T2.[Date] 
    ) AS T2 
) AS T 
OUTER APPLY 
(
    SELECT TOP 1 T3.Customer, T3.[Date], T3.Item 
    FROM @T AS T3 
    WHERE T3.Customer = T.Customer 
    AND T3.[Date] > T.SecondOrderedDate 
    ORDER BY T3.[Date] 
) AS T3; 

注:看你还没有真正给有关的是定制任何细节r在同一天订购不同的项目,我假设每个客户在给定日期只订购了一件东西,但如果情况并非如此,那么您必须稍微调整查询逻辑。

相关问题