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

「人」が2つの製品を購入した最新の2つの日付の違い(秒単位)を示すレポートを実行する必要があります。

したがって、たとえば、サッカーやバスケットボールを使用する場合は、次のようなことを知る必要があります。

 jim  | 60
 jane | 3180

結果は、ジムの最近のサッカーとバスケットボールの購入が60秒間隔(04:00と03:00)であり、ジェーンのサッカーとバスケットボールの購入が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

しかし、すべての人の結果を確認するには、このクエリをループで実行する必要があります。

私はこれを行うためのより賢い方法があると確信しています、そして私はそれが何であるかを知らないだけです。

誰かが何か提案をすることができますか?私はPostgres8.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 の最新の購入であり、2 つの製品 (たとえば、両方とも製品 A である可能性があります) の最新のものではないと解釈しています。

于 2013-02-28T22:03:58.523 に答える