1

感谢您的关注。

我试图让每个客户的访问之间的时间最短。使用下面的代码,我得到了每次访问之间的时间量,但它正在比较每个日期。我只需要最小的边距,然后摆脱/隐藏所有其他边距。

select a.account_id, a.transaction_id, b.transaction_date , a.transaction_date,            round(a.transaction_date - b.transaction_date, 0) as Time_between
from time_between_trans a, time_between_trans b
where a.transaction_date > b.transaction_date
and a.account_ID like '717724'
and a.account_id = b.account_id
  • 对于 transaction_date 中的每个日期,在交易中找到最接近它的日期

  • 它们必须具有相同的 account_id,并且第二个日期必须晚于第一个日期

4

1 回答 1

1

您需要在查询中添加分组依据:

select a.account_id, a.transaction_id, min(time_between) as min_time_between
from (select a.account_id, a.transaction_id, b.transaction_date, a.transaction_date,
             round(a.transaction_date - b.transaction_date, 0) as Time_between
      from time_between_trans a join
           time_between_trans b
           on a.transaction_date > b.transaction_date and
              a.account_ID ='717724' and
              a.account_id = b.account_id
     ) a
group by a.account_id, a.transaction_id

我还修复了您的连接语法以使用正确的连接语法,并将“like”更改为“=”,因为您没有通配符。

可能有其他方法来表达这一点,但这是标准 SQL。您应该指定您在问题中使用的数据库。

如果您使用的是 Oracle,那么只需执行以下操作:

select a.*,
       (case when nextdt - transaction_date) < transaction_date - nextdt
             then nextdt - transaction_date)
             else transaction_date - nextdt
        end) as mintime
from (select a.*,
             lead(transaction_date, 1) over (partition by account_id order by transaction_date) as nexttd,
             lag(transaction_date, 1) over (partition by account_id order by transaction_date) as prevtd
      from time_between_trans a
     ) a

实际上,这并不完全正确,因为对于 nexttd 和 prevtd,您必须考虑 NULL。但是,这个想法很简单。领先和滞后功能让您可以进行 prev 或 text 交易,然后您可以做任何您想做的事情来找到最小值——或者从记录中获取您想要的任何其他信息。

于 2012-07-30T01:57:09.827 回答