Найти самую раннюю дату транзакции при использовании даты транзакции в предложении "WHERE" - PullRequest
0 голосов
/ 02 марта 2020

Я создаю ежедневный отчет о транзакциях, которые произошли накануне покупки (как новой, так и предыдущей). Для простоты это выглядит так:

SELECT 
Table.Identifier as 'Number',
Table.Name as 'Customer Name',
Table.PurchaseDate as 'Date',
sum(Table.Amount) as 'Amount',
Case 
when 'SOME CODE' then 'NEW'
when sum(Table.Amount) > 0 then 'INC'
when sum(Table.Amount) < 0 then 'DEC'
end case as 'Transaction Type'
Where
Table.TransactionEntryDate = DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7 
                        WHEN 1 THEN -2 
                        WHEN 2 THEN -3 
                        ELSE -1 
                    END, DATEDIFF(DAY, 0, GETDATE()))

Дата транзакции - последний рабочий день (если сегодняшний понедельник, последний день - пятница), я хочу только записи с датой транзакции в качестве последней бизнес-даты, но чтобы классифицировать его как NEW тип транзакции, мне нужно посмотреть, является ли сегодняшняя дата транзакции минимальной датой транзакции для Identifier / Number. но поскольку предложение WHERE уже отфильтровывает все необязательные даты, любое предложение, которое я поместил в 'SOME CODE' место предложения CASE, вернет NEW

ie, если мы рассмотрим два случая

Идентификатор транзакции # 1 происходят несколько дней go, но транзакция возврата и другая покупка была сделана в предыдущий рабочий день. (Мы заботимся о транзакции net). Таким образом, в таблице 2 записи. Я хочу, чтобы функция CASE видела, что минимальная (ie первая) дата входа НЕ является предшествующим рабочим днем, и перейду к делу "DE C".

Идентификатор транзакции № 5 происходит в предыдущий рабочий день. Это первая запись в таблице. Я хочу, чтобы функция case распознала, что самая ранняя дата ввода идентификатора № 5 является предшествующей рабочей датой, поэтому функция CASE назначает тип транзакции как NEW.

sample table described above

Однако я не могу использовать функцию подсчета, поскольку иногда в один и тот же день происходит несколько транзакций для одного и того же идентификатора, и я хочу, чтобы они суммировались. Иногда «Дата покупки» отличается от даты транзакции, так как заказы предварительно заказываются до фактической транзакции, поэтому я не могу просто сделать when PurchaseDate = TransactionEntryDate

Вот то, что я хотел бы таблицу выглядеть. Однако, поскольку для идентификатора № 1 отфильтрована транзакция 25 февраля, a, когда when min(Table.TransactionEntryDate) = Table.TransactionEntryDate then 'NEW' также вернет 'NEW'

desired outcome

Примерно так (но в моем запросе это не работает)

when min(All Table.TransactionEntryDate where Table.identifier= Table.Identifier AND Table.PurchaseDate= Table.PurchaseDate) = DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7 
                        WHEN 1 THEN -2 
                        WHEN 2 THEN -3 
                        ELSE -1 
                    END, DATEDIFF(DAY, 0, GETDATE())) then 'NEW'

1 Ответ

1 голос
/ 02 марта 2020

Я думаю, что это определит для каждой строки, если существует более ранняя строка:

OUTER APPLY (SELECT TOP(1) Identifier
             FROM Table T1
             WHERE T1.Identifier = Table.Identifier
             AND T1.TransactionEntryDate < Table.TransactionEntryDate) AS PriorTransactionExists

А затем в вашем случае:

CASE WHEN PriorTransactionExists.Identifier IS NULL THEN 'NEW'

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

РЕДАКТИРОВАТЬ ПОСЛЕ РЕАЛИЗАЦИИ ЭТОГО MYSQL:

Case when not exists (SELECT 1 FROM Table T1
             WHERE T1.Identifier = Table.Identifier
             AND T1.TransactionEntryDate < Table.TransactionEntryDate) THEN 'New'
...