Mysql 自上次购买以来的时间

Mysql 自上次购买以来的时间,mysql,sql,optimization,Mysql,Sql,Optimization,因此,我在数据库中有一个表,其中包含以下字段: 事务ID 客户ID 交易日期 我想在表中添加一个名为 每个客户自上次交易以来的时间 这应该是交易日期A-交易日期B,前提是客户相同,并且表是按日期排序的 我使用的是mySQL,所以没有Oracle高级PL/SQL。我的桌子有很多行 从txns中选择txn_id、客户id、txn_日期 如何做到这一点?我认为使用相关子查询最容易做到这一点: select t.*, datediff((select t2.TransactionDate

因此,我在数据库中有一个表,其中包含以下字段:

事务ID 客户ID 交易日期 我想在表中添加一个名为

每个客户自上次交易以来的时间 这应该是交易日期A-交易日期B,前提是客户相同,并且表是按日期排序的

我使用的是mySQL,所以没有Oracle高级PL/SQL。我的桌子有很多行

从txns中选择txn_id、客户id、txn_日期


如何做到这一点?

我认为使用相关子查询最容易做到这一点:

select t.*,
       datediff((select t2.TransactionDate
                 from t t2
                 where t2.CustomerId = t.CustomerId and
                       t2.TransactionDate < t.TransactionDate
                 order by t2.TransactionDate desc
                 limit 1
                ), t.TransactionDate) as daysSinceLastPurchase
from t;
这就假设交易发生在不同的日期

如果此假设不成立且事务ID按升序排列,则可以使用:

select t.*,
       datediff((select t2.TransactionDate
                 from t t2
                 where t2.CustomerId = t.CustomerId and
                       t2.TransactionId < t.TransactionId
                 order by t2.TransactionId desc
                 limit 1
                ), t.TransactionDate) as daysSinceLastPurchase
from t;

相关子查询主题略有变化:

SELECT t1.*,
    datediff(t1.tdate,
             (select MAX(t2.tdate) from trans AS t2 
              where t1.cid = t2.cid and t2.tdate < t1.tdate
             )
            ) AS 'delta'
FROM trans AS t1;

请参见

您想要一个自动计算的字段还是只初始化一次值?我正在构建一个分析表,所以只初始化一次。