在 "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'
我正在为购买前一天发生的交易(包括新的和以前的)创建每日报告。为简单起见,它看起来像:
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'