2016-07-08 12 views
0

から最も近い値を結合する方法を私が持っている次の表Postgresは:同じテーブル

CREATE TABLE temp (
    id SERIAL, 
    other_id INTEGER NOT NULL, -- some ForeignKey 
    date DATE NOT NULL 
) 

私は同じother_idで、前の(最も近い)date項目によってそれ自体に、このテーブルに参加したいです。

SELECT count(*) 
FROM temp AS t1 
JOIN temp AS t2 ON (t2.other_id = t1.other_id AND t2.date < t1.date) 

しかしt2.datet1.date(ない任意の下の日付)に最も近いでなければならないような何か。

これはまったく可能ですか?

+0

それぞれ新しい生の日付で右に増加しますか?私は日付がランダムな権利ではないことを意味しましたか? –

+0

"しかし、' t2.date'は 't1.date'(より低い日付ではありません)に最も近いものでなければなりません。"あなたは 't2'から' t1.date'に最も近い日付を意味しますが、 't1の後ろにもあります。日付? –

+0

@FathahRehmanP日付はランダムであり、厳密には増加していません。 –

答えて

2

あなたは次のようなクエリを使用することができます。

WITH temp_rn AS (
    SELECT id, other_id, date, 
     ROW_NUMBER() OVER (PARTITION BY other_id 
          ORDER BY date) AS rn 
    FROM temp 
) 
SELECT t1.* 
FROM temp_rn AS t1 
LEFT JOIN temp_rn AS t2 ON t1.other_id = t2.other_id AND t1.rn = t2.rn + 1 

クエリが順番にROW_NUMBERを使用しています「前の」行を検出する。これは、同じother_idのスライス内の前の行番号を持つ行である。

0

それはあなたが後にしているものを完全には明らかではないが、このような何かがそれを行う可能性があります:

select count(*) 
from temp as t1 
    join lateral (
     select t.other_id, max(t.date) 
     from temp as t 
     where t.date < t1.date 
     and t.other_id = t1.other_id 
     group by t2.other_id 
) as t2 on t2.other_id = t1.other_id; 
関連する問題