首页 > 解决方案 > SQL 查找 Orders 表中每一行的下一个订单日期

问题描述

我有一个订单表。每个订单都附有一个日期和一个 customer_id。

我试图确定有多少情况下客户的订单间隔超过 365 天。

我的解决方案如下,将订单表留给自己,以确定用户的下一个订单;但是,这运行得非常慢并且感觉非常低效:

SELECT
  COUNT(*)
FROM (
  SELECT
    transactions.customer_id,
    transactions.transaction_date,
    DATEDIFF(day, transactions.transaction_date, MIN(next_transactions.transaction_date)) days_to_next_transaction
  FROM (
    SELECT
      customer_id,
      transaction_date
    FROM
      transactions_table
  ) transactions
  LEFT JOIN (
    SELECT
      customer_id,
      transaction_date
    FROM
      transactions_table
  ) next_transactions
  ON
    transactions.customer_id = next_transactions.customer_id AND
    transactions.transaction_date < next_transactions.transaction_date;
)
WHERE
  days_to_next_transaction > 365

从理论上讲,我觉得我可以按customer_id然后对我的订单列表进行排序transaction_date。从这里我只需要对所有行进行一次传递:我会将一行与紧随其下的行进行比较 - 如果下一行与我当前行共享相同的 customer_id,我将计算下一笔交易的天数作为下一列中日期之间的差异 - 当前日期。

有什么方法可以实现吗?

标签: sqlpostgresql

解决方案


推荐阅读