查询以根据过帐日期过滤订单吗?

时间:2020-02-18 12:51:48

标签: sql sql-server tsql sql-server-2008 window-functions

我有一个条件,我必须在其中编写查询以每月使用日期过滤器来获取某些内容,

  1. 我们可以针对一个订单使用多个发票(每个发票都有新的过帐日期)
  2. 我必须获取在第一个月过帐的此类发票的记录,对于使用新日期过滤器进行下个月的查询,此类记录不应成为结果集的一部分。

例如

enter image description here

现在为2019年2月发布的相同订单提供另一张发票。

enter image description here

现在,当我对一月份运行此查询时,只应显示一月发布日期的记录,而当我对二月份运行此查询时,则此订单不应成为结果集的一部分,因为我们已经决定它将成为上个月的一部分(一月)结果集。

我正在使用以下查询来获取结果,但是它给出了1月的正确结果,但是对于2月也再次显示了相同的结果。在这方面请提供帮助。

DECLARE @From DATETIME
DECLARE @To DATETIME

SET @From = '2018-01-01 00:00:00.000'
SET @To = '2018-01-30 23:59:59.997'

SELECT *
FROM (
    SELECT s.OrderNumber
        ,i.InvoiceNumber
        ,i.new_PostedDate
        ,i.new_CanceledDate
        ,s.new_OrderStatus
        ,i.StatusCode
        ,s.ModifiedOn
        ,ROW_NUMBER() OVER (
            PARTITION BY s.OrderNumber ORDER BY i.new_PostedDate ASC
            ) AS RowNumber
    FROM SalesOrders s
    INNER JOIN Invoices i ON s.SalesOrderId = i.SalesOrderId
    LEFT JOIN StatusReasonsLookup sl ON i.StatusCode = sl.Id
        AND (i.new_PostedDate >= @From)
        AND (i.new_PostedDate <= @To)
        --Where sl.StatusCodeName  <> 'Canceled' 
    ) tblInvoice
WHERE RowNumber = 1

1 个答案:

答案 0 :(得分:0)

我怀疑您想要

select *
from (
    select 
        s.*, 
        min(posted_date) over(partition by order_number) first_posted_date
    from salesorders s
) s
where 
    s.posted_date = s.first_posted_date
    s.first_posted_date between @from and @to

内部查询使用窗口min()来恢复每个发票的第一个posted_date。然后,外部查询会在每个组的第一条记录上进行过滤,其首个posted_date与过滤器匹配。