sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz pro získání nejnovější ceny

Myslím, že jediným řešením s vaší strukturou tabulky je pracovat s poddotazem:

SELECT *
   FROM Thing
   WHERE ID IN (SELECT max(ID) FROM Thing 
                   WHERE ThingID IN (1,2,3,4)
                   GROUP BY ThingID)

(Uvedené nejvyšší ID znamená také nejnovější cenu)

Doporučuji však přidat sloupec „IsCurrent“, který je 0, pokud to není nejnovější cena, nebo 1, pokud je nejnovější. To sice přidá možné riziko nekonzistentnosti dat, ale hodně to celý proces urychlí, když se tabulka zvětší (pokud je v indexu). Pak vše, co musíte udělat, je...

SELECT *
   FROM Thing
   WHERE ThingID IN (1,2,3,4)
     AND IsCurrent = 1

AKTUALIZACE

Dobře, Markus aktualizoval otázku, aby ukázal, že ID je jedinečné ID, nikoli int. Díky tomu je psaní dotazu ještě složitější.

SELECT T.* 
   FROM Thing T
   JOIN (SELECT ThingID, max(PriceDateTime)
            WHERE ThingID IN (1,2,3,4)
            GROUP BY ThingID) X ON X.ThingID = T.ThingID 
                                AND X.PriceDateTime = T.PriceDateTime
   WHERE ThingID IN (1,2,3,4)

Opravdu bych navrhoval použít buď sloupec "IsCurrent" nebo jít s jiným návrhem nalezeným v odpovědích a použít tabulku "aktuální cena" a samostatnou tabulku "historie cen" (což by nakonec bylo nejrychlejší, protože zachovává cenu samotný stůl je malý).

(Vím, že ThingID ve spodní části je nadbytečné. Jen zkuste, zda je rychlejší s tím „KDE“ nebo bez něj. Nejsem si jistý, která verze bude rychlejší, až optimalizátor odvede svou práci.)



  1. výběrem NLS_LANG pro Oracle

  2. Jak uniknout speciálním znakům v MySQL?

  3. Použití Geekbench 3 k vyhodnocení výkonu databázového serveru

  4. Jak lze porazit sanitaci bez jednoduchých uvozovek injekcí SQL na serveru SQL?