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。

4

1 回答 1

1

这是你想要的吗?

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)。

于 2013-02-28T22:03:58.523 回答