2016-07-08 14 views
0

Ich habe eine der folgende TabellePostgres: Wie am nächsten Wert aus derselben Tabelle verbinden

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

Ich mag diese Tabelle durch vorheriges (nächstes) date Element mit denselben other_id mir verbinden. So etwas wie

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

Aber t2.date muss am nächsten t1.date (nicht niedrigen Datum) sein.

Ist das überhaupt möglich?

+0

in jedem neuen Rohdatum wird richtig erhöhen? ich meinte date ist nicht zufällig oder? –

+0

Mit "Aber' t2.date' muss am nächsten zu 't1.date' sein (kein niedrigeres Datum)." Sie meinen das Datum, das 't1.date' am nächsten von' t2' ist, aber auch nach 't1. Datum', richtig? –

+0

@FathahRehmanP Datum ist zufällig, nicht streng erhöht –

Antwort

2

Sie können eine Abfrage wie die folgende verwenden:

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 

Die Abfrage ROW_NUMBER verwendet, um um die 'vorherige' Zeile zu erkennen: Es ist diejenige mit der vorherigen Zeilennummer innerhalb derselben other_id Scheibe.

0

Es ist nicht ganz klar, was Sie nach, aber so etwas wie dies könnte es tun:

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; 
Verwandte Themen