Tvorba dotazu   zodpovězená otázka

Databáze

Zdravím.

Potřebuji vytvořit dotaz který z následující ukázky vytáhne pouze vždy jednoho klienta (první sloupec) a to toho, který má IdRadku (poslední sloupec) nejvyšší. Tzn. ve výsledku se nesmí objevit třetí řádek, ale musí tam zůstat ten poslední.

Sloupce KlientVRoce, HlavniDroga, IdZapisu

5 21 5

4 15 6

21 9 7

24 29 8

47 1 16

37 2 17

21 3 18

Pokus byt tento, ale nepovedlo se

SELECT KlientVRoce, HlavniDroga, IdZapisu

FROM Zapisy AS T1

WHERE (IdZapisu IN

(SELECT MAX(IdZapisu) AS Expr1

FROM Zapisy AS T2

WHERE (IdZapisu = T1.IdZapisu))) AND (HlavniDroga > 0)

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud jsem správně pochopil, že z celé tabulky potřebujete vytáhnout pouze jeden záznam, tak pak to bude velice jednoduše:

SELECT TOP 1 KlientVRoce, HlavniDroga, IdZapisu 
  FROM Zapisy
 ORDER BY IdZapisu DESC

případně

SELECT KlientVRoce, HlavniDroga, IdZapisu 
  FROM Zapisy
 WHERE IdZapisu = (SELECT MAX(IdZapisu) FROM Zapisy)
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ne - asi jsem to špatně napsal. Potřebuji ty záznamy všechny až na ten jeden. Takže výsledek by měl vypadat takto

5 21 5

4 15 6

24 29 8

47 1 16

37 2 17

21 3 18

Tento záznam - 21 9 7 má nižší id (poslední sloupec), tak ten zobrazit nechci.

Jsou to nějaké informace o klientech, které se aktualizují a mě vždy zajímá poslední záznam u každého klienta.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže například takhle:

SELECT KlientVRoce, HlavniDroga, IdZapisu 
  FROM Zapisy
 WHERE NOT EXISTS (SELECT NULL FROM Zapisy Sub WHERE Sub.KlientVRoce = Zapisy.KlientVRoce AND Sub.IdZapisu > Zapisy.IdZapisu)

nebo

SELECT KlientVRoce, HlavniDroga, IdZapisu 
  FROM Zapisy INNER JOIN 
       (SELECT KlientVRoce, MAX(IdZapisu) AS IdZapisu
	  FROM Zapisy
	 GROUP BY KlientVRoce) Sub ON Sub.IdZapisu = Zapisy.IdZapisu
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano - a právě jsem nakonec dal dohromady řešení :-) je to vlastně stejné jako to vaše druhé. Díky moc! Btw. máte zkušenost s tím, co je rychleji zpracováno?

Ještě jednou díky!

SELECT  la.IdZapisu, la.KlientVRoce, la.HlavniDroga  
FROM
  Zapisy as la
INNER JOIN
  (
    SELECT
	 KlientVRoce,  MAX(IdZapisu) AS maxid

    FROM
      Zapisy
	  WHERE HlavniDroga > 0
    GROUP BY
      Zapisy.KlientVRoce
    ) as lb
ON
  la.IdZapisu = lb.maxid
nahlásit spamnahlásit spam 0 odpovědětodpovědět

To konkrétně těžko říct, je potřeba si to odzkoušet a kouknout na skutečné execution plány obou variant (samozřejmě jen pokud tam v reálu budete mít tolik dat, že bude vůbec potřeba se optimalizací zabývat).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No v této aplikaci jich hrozí relativně dost - statisíce záznamů - za nějakou dobu. Vyzkouším. Ještě jednou díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback