Найти самую раннюю дату транзакции при использовании даты транзакции в предложении WHERE

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

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

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

Идентификатор транзакции № 1 произошел несколько дней назад, но транзакция возврата и другая покупка были совершены накануне рабочего дня. (Нам важна чистая транзакция). Таким образом, в таблице есть 2 записи. Я хочу, чтобы функция CASE увидела, что минимальная (т.е. первая) дата входа НЕ является предыдущим рабочим днем, и продолжила бы дело "DEC".

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

пример таблицы, описанный выше

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

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

желаемый результат

Что-то вроде этого (но это не работает в моем запросе)

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'

person morg    schedule 02.03.2020    source источник
comment


Ответы (1)


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

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'
person George Dando    schedule 02.03.2020
comment
Я определенно вниз, чтобы попробовать это! (и я не лучший объяснитель), но я понятия не имею, куда добавить это в свой запрос, я новичок в SQL, но знаю основы. - person morg; 02.03.2020
comment
Ааа, я только что заметил, что это mysql, надо было приглядеться. Боюсь, это, вероятно, не будет применимо. Отредактирую ответ через секунду. - person George Dando; 02.03.2020