řazení dle dvou sloupců rubrika: Databáze: SQL

3 Fidelio
položil/-a 15.12.2014

Zdá se to triviální a možná také bude, ale já si s tím neví rady...

Mám 2x timestamp, caszalozeni, caszmeny

potřebuju projít posledních 5000 změn v databázi např - tedy jedním dotazem vybrat 5000 posledních timestampu z těcht odvou sloupců

order by caszalozeni, caszmeny mi tohle neřeší...

Věřím, že pro mnohé z Vás toto bude snadné :)

Díky za ponaučení a předem prosím, že nápady typu "ukládej si čas založení do času změny" nebere :)))

odkaz
9 Honza Břešťan
odpověděl/-a 15.12.2014

V ORDER BY by mel jit pouzit CASE nebo GREATEST (podle DB enginu)

ORDER BY
    CASE WHEN caszalozeni > caszmeny THEN caszalozeni
    ELSE caszmeny END
DESC

Nebo pokud to tvoje DB podporuje:

ORDER BY GREATEST(caszalozeni, caszmeny) DESC

Jinak to ale vypada, ze by mohl stacit COALESCE. Pokud je to tak, ze caszalozeni je vyplneny vzdy a caszmeny je bud NULL nebo vyssi nez caszalozeni, staci neco jako tohle.

ORDER BY COALESCE(caszmeny, caszalozeni) DESC

Pokud caszmeny chybi, pouzije se caszalozeni. Jinak se pocita, ze caszmeny proste bude vyssi.

Je to trochu komplikovanejsi, pokud ten posledni predpoklad neplati, ale aspon jedna z tech hodnot muze byt NULL. Pak je potreba ty pristupy zkombinovat, protoze jednotlive nebudou stacit na pokryti vsech moznosti.

Komentáře

  • Augi : A pokud ten dotaz děláš často, tak nad tím výrazem postavit index (pokud to tvoje databáze podporuje). 16.12.2014
  • onelook : Pokud nad tím nebude (nepůjde vytvořit - třeba MySQL) index, tak to bude velmi neefektivní. Nicméně stačí oindexovat oba sloupce zvlášť, vyselektovat posledních 5000 záznamů z jednoho i druhého (celkem 10000) a ty pak teprve mergnout do sebe (tedy použít řazení, chytrá DB bude vědět, že stačí použít merge, hloupá asi ne...) a vzít z toho 5000 záznamů. Bude to cca 2x pomalejší než s indexem přes to maximum, což jde v pohodě přežít. 16.12.2014

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.