Sql 查询以传递所有产品的两个最近日期之间的差异

Sql 查询以传递所有产品的两个最近日期之间的差异,sql,postgresql,datetime,union,Sql,Postgresql,Datetime,Union,我有一个如下所示的数据库: person | product | purchase_time -------+------------+--------------------- jim | football | 2013-02-28 00:01:00 jane | basketball | 2013-02-28 01:01:00 ben | baseball | 2013-02-28 02:02:00 jim | basketball | 2013-0

我有一个如下所示的数据库:

person | product    |    purchase_time
-------+------------+---------------------
jim    | football   | 2013-02-28 00:01:00
jane   | basketball | 2013-02-28 01:01:00
ben    | baseball   | 2013-02-28 02:02:00
jim    | basketball | 2013-02-28 00:01:00
jim    | basketball | 2013-02-28 00:03:00
jim    | football   | 2013-02-28 00:04:00
jane   | baseball   | 2013-02-28 00:05:00
jane   | football   | 2013-02-28 00:08:00
jane   | basketball | 2013-02-28 01:03:00
ben    | baseball   | 2013-02-28 03:02:00
我需要运行一个报告,该报告将告诉我一个人最近购买任何两种产品的两次日期之间的差异(以秒为单位)

例如,如果我使用足球和篮球,我需要知道如下内容:

 jim  | 60
 jane | 3180
jim最近购买的足球和篮球相隔60秒(分别在04:00和03:00),jane购买的足球和篮球相隔3180秒(分别在08:00和01:03)

我可以通过一个循环逐个执行此操作,我可以使用如下查询:

     SELECT a.person,
       abs(DATE_PART('epoch', a.purchase_time - b.purchase_time)
FROM
  (SELECT *
   FROM mytable
   WHERE person = 'jim'
     AND product = 'football'
   ORDER BY purchase_time LIMIT 1) a,
  (SELECT *
   FROM mytable
   WHERE person = 'jim'
     AND product = 'basketball'
   ORDER BY purchase_time LIMIT 1) b
但是为了查看每个人的结果,我必须通过循环执行这个查询

我相信有一种更聪明的方法可以做到这一点,我只是不知道它是什么

有人能提供一些建议吗?我正在使用Postgres 8.1.23。

这就是你想要的吗

select person, abs(DATE_PART('epoch', p1 - p2) 
from (select person,
             MAX(case when product = 'football' then purchase_time end) as p1,
             MAX(case when product = 'basketball' then purchase_time end) as p2
      from mytable
      group by person
     ) p
where p1 is not null and p2 is not null

我将这个问题解释为最近购买的产品A和最近购买的产品B,而不是最近购买的两种产品(例如,这两种产品可能都是产品A)。

您的示例结果应显示其他字段,以明确在每种情况下使用的行。我可以看到一些不同的可能答案,这取决于我对你想要的问题所做的假设。@Jason:你为什么不把ben包括在结果中?每人有1个最小时间间隔?。请考虑升级到一个现代版本。@ Pieter Geerkens -请让我知道你想让我钉住哪些假设。@ DeBeldNeWim-Ben的外观是Opthal.这正是我想要的,除了一件事。这会发现最早的日期差异,而不是最晚的。我将处理这个查询,看看能否使它工作。此外,您还需要在DATE_PART结束括号后添加另一个括号。