Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So erhalten Sie die nächsten Daten in Oracle SQL

Sie müssen nur eine einzige kartesische Verknüpfung verwenden, um Ihr Problem zu lösen, im Gegensatz zu den anderen Lösungen, die mehrere verwenden. Ich nehme an, die Zeit wird als VARCHAR2 gespeichert. Wenn es als Datum gespeichert ist, können Sie die TO_DATE-Funktionen entfernen. Wenn es als Datum gespeichert ist (ich würde dies sehr empfehlen), müssen Sie die Datumsteile entfernen

Ich habe es etwas ausführlicher gemacht, damit es offensichtlich ist, was los ist.

select *
  from ( select id, tm
              , rank() over ( partition by t2id order by difference asc ) as rnk
           from ( select t1.*, t2.id as t2id
                       , abs( to_date(t1.tm, 'hh24:mi:ss') 
                              - to_date(t2.tm, 'hh24:mi:ss')) as difference
                    from t1
                   cross join t2
                         ) a
                 )
 where rnk = 1

Grundsätzlich berechnet dies die absolute Differenz zwischen jedem Zeitpunkt in T1 und T2 und wählt dann die kleinste Differenz nach T2 ID aus; Rückgabe der Daten von T1.

Hier ist es im SQL Fiddle-Format .

Das weniger hübsche (aber kürzere) Format ist:

select *
  from ( select t1.*
              , rank() over ( partition by t2.id 
                                  order by abs(to_date(t1.tm, 'hh24:mi:ss') 
                                            - to_date(t2.tm, 'hh24:mi:ss'))
                                  ) as rnk
           from t1
          cross join t2
                ) a
 where rnk = 1