sql >> Databáze >  >> RDS >> Oracle

Jak získat nejbližší data v Oracle sql

K vyřešení problému musíte použít pouze jedno kartézské spojení na rozdíl od jiných řešení, která používají více. Předpokládám, že čas je uložen jako VARCHAR2. Pokud je uloženo jako datum, můžete odebrat funkce TO_DATE. Pokud je uloženo jako datum (vřele doporučuji), budete muset odstranit části data

Udělal jsem to trochu podrobně, takže je zřejmé, co se děje.

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

V zásadě to zjistí absolutní rozdíl mezi každým okamžikem v T1 a T2 a poté vybere nejmenší rozdíl podle T2 ID; vrácení dat z T1.

Zde je ve formátu SQL Fiddle .

Méně pěkný (ale kratší) formát je:

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


  1. Používáte sqlalchemy dburi s Oracle pomocí External Password Store?

  2. Přidejte cizí klíč do existující tabulky v SQLite

  3. Jak zvýšit maximální velikost nahrávaného souboru dotazu LOAD DATA INFILE?

  4. Jak mohu předat pole hodnot mé uložené proceduře?