Запросить фильтрацию заказов по дате публикации? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть требование, где я должен написать запрос, чтобы получить что-то с фильтром даты ежемесячно, как это.

  1. у нас может быть несколько счетов на заказ (каждый счет с новой опубликованной датой)
  2. Мне нужно получить записи таких счетов, которые публикуются в самом первом месяце, и для запроса следующего месяца с новым фильтром дат такие записи не должны быть частью набора результатов.

Например

enter image description here

Теперь еще один счет на тот же заказ, опубликованный в феврале 2019 года.

enter image description here

Теперь, когда я запускаю этот запрос для января, должна появиться только запись с датой публикации за январь, а когда я выполняю этот запрос за февраль, этот порядок не должен быть частью набора результатов. как мы уже решили, что это будет частью результатов предыдущего месяца (января).

Я использую следующий запрос, чтобы получить результат, но он дает правильный результат за январь, но снова показывает тот же результат и за февраль. Пожалуйста, помогите в этом отношении.

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 голосов
/ 18 февраля 2020

Я подозреваю, что вы хотите:

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 соответствует фильтру.

...