【问题标题】:How do I get details of the latest transaction made by all customers?我如何获得所有客户的最新交易详情?
【发布时间】:2021-07-02 07:36:12
【问题描述】:

以下是示例表

SrNo, Date, TypeOfTran, CustID, AmtDue, AmtRec
1, 01-Jan-2021, 0,      A,       102,       0
2, 01-Jan-2021, 0,      A,       120,       0
1, 02-Jan-2021, 0,      D,       140,       0
1, 02-Jan-2021, 1,      D,         0,     176
2, 02-Jan-2021, 1,      D,         0,     188
1, 05-Jan-2021, 0,      P,         0,     196
2, 05-Jan-2021, 1,      L,         0,     134

*TypeOfTran [到期 = 0,收据 = 1]

SrNo 在日期更改和 TyepOTran 更改时重置

我想创建一个查询,该查询将返回每个客户的最后一条记录。

客户可以在一天中的任意时间进行购买和/或付款。

我阅读了 how do I query sql for a latest record date for each user 查询中给出的答案,但这是基于一个条件,即日期。

我正在使用 MS Access

谢谢。

Please see attached image of above table

【问题讨论】:

  • 定义“每个客户的最后记录”。您是否正在寻找客户最后一次交易的最高 SrNo?鉴于您可以在每个日期为每个客户提供两个系列的 SrNo,因此很难为每个客户选择一个记录。您可以很容易地获得查询中每种交易类型的最高 SrNo。
  • “您是否在寻找客户最后一次交易日期的最高 SrNo?” 是的,我是。请指教。顺序类似于 [latest] Date、[highest] TranType 和最高 [SrNo]。

标签: sql ms-access


【解决方案1】:

您需要另一个条件来匹配最后一个SrNo。试试下面的查询。这里tDate 是您的日期列。由于date 是保留关键字,所以我使用tDate 作为列名。

select t.*
from Table1 as t
inner join (
    select CustID, max(tdate) as MaxDate, max(SrNo) as MaxSr
    from Table1
    group by CustID
) as t2 on t.CustID = t2.CustID and t.tdate = t2.MaxDate and t.SrNo=t2.MaxSr

【讨论】:

  • 亲爱的 Harun,感谢您的及时回复,我确实尝试了您的建议,但 'max(SrNo)' 不返回相对于 max(TDate) 的 max(SrNo),而是搜索当前 'CustID' 的整个数据库并返回 max(SrNo)。例如如果“D”在 2021 年 2 月 25 日完成了 5 次交易,则此查询将返回 Max(Date) 为 2021 年 1 月 2 日,Max(SrNo) 为 5
  • @Coder 我假设SrNo 是基于每个日期的。表示每天SrNo 从 1 开始并增加与插入的记录一样多。如果不是这种情况,那么您将如何确定哪条记录是客户每天的最后一笔交易?还有其他逻辑吗?
【解决方案2】:

SQL 表代表无序 集合。因此,您需要第二列来获取每天的最后一列。如果日期列具有时间组件,这将得到解决,但似乎并非如此。让我假设SrNo 提供一天的订购。

如果是这样:

select t.*
from t
where t.date = (select max(t2.date) 
                from t as t2 
                where t2.custId = t.custId
               ) and
      t.SrNo = (select max(t2.SrNo) 
                from t as t2 
                where t2.custId = t.custId and t2.date = t.date
               ) ;

第一个条件获取最后日期的值。第二个获取日期的最后一个值,假设 SrNo 提供该排序。

为了提高性能,您需要在(custId, date, srNo) 上建立索引。

【讨论】:

  • 是的,SrNo 确实提供了排序。按照您的建议尝试了查询,但没有返回任何结果,等待超过 15 分钟;它仍然在下面的状态栏中显示“正在运行查询”消息。请注意,我在 Access 数据库中有很多行。
  • @Coder 。 . .尝试添加推荐的索引。
猜你喜欢
  • 1970-01-01
  • 2020-10-26
  • 2019-08-14
  • 2017-03-07
  • 2023-04-01
  • 2019-10-11
  • 2014-07-20
  • 2016-10-24
  • 2023-01-05
相关资源
最近更新 更多