在 "WHERE" 子句中使用交易日期时查找最早交易日期

Find Earliest Transaction Date when using Transaction Date in "WHERE" clause

我正在为购买前一天发生的交易(包括新的和以前的)创建每日报告。为简单起见,它看起来像:

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 子句已经过滤掉所有不需要的日期,所以我放在 CASE 子句的 'SOME CODE' 位置的任何子句都将 return NEW

即如果我们考虑这两种情况

交易标识符 #1 发生在几天前,但 return 交易和另一笔购买是在前一个工作日进行的。 (我们关心净交易)因此 Table 中有 2 个条目。我希望 CASE 函数看到最短(即第一个)输入日期不是前一个工作日,然后继续 "DEC" 案例。

交易标识符 #5 发生在前一个工作日。这是 Table 中的第一个条目。我希望 case 函数识别标识符 #5 的最早输入日期是之前的业务日期,因此 CASE 函数将交易类型指定为 NEW。

但是,我无法使用计数功能,因为有时同一标识符在同一天有多个交易,我希望将它们相加。有时 "Purchase Date" 与交易日期不同,因为订单是在实际交易之前预先订购的,所以我不能只做 when PurchaseDate = TransactionEntryDate

这是我希望 table 的样子。然而,由于标识符 #1 过滤掉了 2 月 25 日的交易,当 when min(Table.TransactionEntryDate) = Table.TransactionEntryDate then 'NEW' 也会 return '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'

我认为如果存在较早的行,这将识别每一行:

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'