报告SQL Server上的上一个记录

问题描述 投票:0回答:2

我在这里挣扎了一下。数据制作,但查询的概念是非常真实的。我需要选择客户,当前的金额,先前数量,顺序和日期WHERE日期<1190105,日期/ SEQ是之前由客户在该日期点分组的最大日/起。

我花了好几天尝试各种东西使用HAVING,嵌套选择尝试并取得客户的MAX-日期/金额和最小日期/金额并不能完全得到我的头周围。我敢肯定,这应该是很容易的,但任何帮助,您可以提供将非常感激。

谢谢

**SEQ       DATE        CUSTOMER    AMOUNT**
1           1181225     Bob         400
2           1181226     Fred        300
3           1190101     Bob         100
4           1190104     Fred        500
5           1190104     George      200
6           1190105     Bob         150
7           1190106     Bob         200
8           1190110     Fred        160
9           1190110     Bob         300
10          1190112     Fred        400
sql-server
2个回答
1
投票

选择1个使用行号码和滞后功能

SELECT 
    ROW_NUMBER() OVER (Partition By CustomerID Order By [Date]) as Sec,
    [Date],
    Customer,
    Amount as CurrentAmount,
    Lead(Amount) OVER (Partition By CustomerID, Order By [Date]) as PreviousAmount
FROM
    YourTable
WHERE
    [DATE] < 1190105 

选择使用外部应用

SELECT 
    ROW_NUMBER() OVER (Partition By Customer Order By [Date]) as Sec,
    [Date],
    Customer,
    Amount as CurrentAmount,
    Prev.Amount  as PreviousAmount
FROM
    YourTable T
OUTER APPLY (
    SELECT TOP 1 Amount FROM YourTable 
    WHERE Customer = T.Customer AND [Date] < T.[Date]
    ORDER BY [DATE] DESC
) Prev
WHERE
   DATE < 1190105

选择3使用一个相关子查询

SELECT 
    ROW_NUMBER() OVER (Partition By Customer Order By [Date]) as Sec,
    [Date],
    Customer,
    Amount as CurrentAmount,
    (
        SELECT TOP 1 Amount FROM YourTable 
        WHERE Customer = T.Customer AND [Date] < T.[Date]
        ORDER BY [DATE] DESC
    )  as PreviousAmount
FROM YourTable
WHERE
    DATE < 1190105

0
投票

首先限制使用日期过滤器行,然后搜索最大的客户。

使用GROUP BY

DECLARE @FilterDate INT = 1190105

;WITH MaxDateByCustomer AS
(
    SELECT
        T.CUSTOMER,
        MaxSEQ = MAX(T.SEQ)
    FROM
        YourTable AS T
    WHERE
        T.Date < @FilterDate
    GROUP BY
        T.CUSTOMER
)
SELECT
    T.*
FROM
    YourTable AS T
    INNER JOIN MaxDateByCustomer AS M ON 
        T.CUSTOMER = M.CUSTOMER AND
        T.SEQ = M.MaxSEQ

使用ROW_NUMBER窗函数:

DECLARE @FilterDate INT = 1190105

;WITH DateRankingByCustomer AS
(
    SELECT
        T.*,
        DateRanking = ROW_NUMBER() OVER (PARTITION BY T.CUSTOMER ORDER BY T.SEQ DESC)
    FROM
        YourTable AS T
    WHERE
        T.Date < @FilterDate
)
SELECT
    D.*
FROM
    DateRankingByCustomer AS D
WHERE
    D.DateRanking = 1
© www.soinside.com 2019 - 2024. All rights reserved.