IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Cyklus v klauzuli WHERE?

Aktivity
Avatar
František Horák:1.3.2022 9:31

Dobrý den, v SQL teprve začínám. Potřeboval bych poradit, jak napsat kód, aby mě postupně v klauzuli WHERE dosazoval postupně obsah sloupce name.

Zkusil jsem: Zatím to, z mého pohledu, dělám neohrabaně. Těchto produktů mám celkem 25 a představa, že tento kód takto kyne, když je vše stejné, jenom se mění položky name je dost frustrující. Děkuji za pomoc.

SELECT
tpf.,
average / LAG(average) OVER (ORDER BY year_value) AS "difference"
FROM t_frantisek_ho­rak_projekt_sql_pri­mary_final tpf
WHERE
name = 'Chléb konzumní kmínový'
UNION
SELECT
tpf.
,
average / LAG(average) OVER (ORDER BY year_value) AS "difference"
FROM t_frantisek_ho­rak_projekt_sql_pri­mary_final tpf
WHERE
name = 'Rýže loupaná dlouhozrnná';

Chci docílit: SELECT
tpf.,
average / LAG(average) OVER (ORDER BY year_value) AS "difference"
FROM t_frantisek_ho­rak_projekt_sql_pri­mary_final tpf
WHERE
name = postupně se doplní všechny hodnoty ze sloupce name

 
Odpovědět
1.3.2022 9:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.3.2022 8:10

To mas cele hrozne spatne navrzene.

  1. databaze mivaji indexy. Bud automaticky nebo je rucne nastavujes (mysql). Vytvoreni indexu znamena, ze si udela pomocnou tabulku, ktera mu zrychli vyhledavani. Obvykle se indexy delaji nad vsemi hodnotami, ktere pouzivas pro WHERE. (to mozna mas nebo nemas)
  2. obvykle, kdyz pouzivas WHERE, tak kvuli rychlosti porovnavani se porovnava co nejmensi retezec. Cili, mas treba index na prvni 2-4 znaky. Ve where porovnas prvni 2 znaky AND porovnas cele slovo. Nebo se vyuziva ciselny INTEREGER (delka je 2-4 znaky) index
  3. Odkud mas ten text? Nebylo by mozne misto toho textu dosadit ciselny index? Jestli to je pole zaskrtavatek, tak to lze udelat jako
<option value="34"> Chléb konzumní kmínový </option>

Cili, predat dalsimu scriptu jen id.

4. Zkus pouzivat kulturu a dotazy pekne zformatovat. Minimalne pomoci online formatovacu kodu, jako treba https://www.dpriver.com/…qlformat.htm
A pro vkladani do forka pouzit tlacitko code </>

5. Mozna by slo pouzit prikaz IN, sloupec IN ('text1', 'text2'). Nebo to chces grupovat? Sloucit urcite radky podle urciteho sloupce, pokud obsahuje stejnou hodnotu. Pozn, opet, tak 100x rychlejsi vyuzitim ciselneho indexu (4 znaky) nez 100 znakoveho textu.

SELECT
      tpf.,
      average / lag(average) over (ORDER BY year_value) AS "difference"
FROM
      t_frantisek_horak_projekt_sql_primary_final tpf
WHERE
      name IN ('Chléb konzumní kmínový', 'Rýže loupaná dlouhozrnná')
GROUP BY
      name
Editováno 2.3.2022 8:11
 
Nahoru Odpovědět
2.3.2022 8:10
Avatar
Petan
Člen
Avatar
Odpovídá na František Horák
Petan:3.3.2022 1:07

No dosti silene spokovat to UNIONEM, kdyz uz tak radeji UNION ALL = mensi zatez pro SQL server.
Moc neznam MySQL ,ale nestacilo by

SELECT
tpf.*,
average / LAG(average) OVER (ORDER BY name,year_value) AS "difference"
FROM t_frantisek_horak_projekt_sql_primary_final tpf

?

 
Nahoru Odpovědět
3.3.2022 1:07
Avatar
Petan
Člen
Avatar
Petan:3.3.2022 1:25

Tohle asi nebude idealni bude to vracet i zanamy ktere slouci i chleb min(year) z ryzi max(year) tak by to chtelo jeste asi
upravit na

SELECT
tpf.*,
average / LAG(average) OVER (ORDER BY name,year_value) AS "difference"
LAG(name) OVER (ORDER BY name,year_value) AS "previous_name"
FROM t_frantisek_horak_projekt_sql_primary_final tpf

a cele to zabalit do

SELECT * FROM (
SELECT
tpf.*,
average / LAG(average) OVER (ORDER BY name,year_value) AS "difference"
LAG(name) OVER (ORDER BY name,year_value) AS "previous_name"
FROM t_frantisek_horak_projekt_sql_primary_final tpf
) X WHERE name <> previous_name

tohle by mohlo fungovat.

 
Nahoru Odpovědět
3.3.2022 1:25
Avatar
František Horák:3.3.2022 7:56

Děkuji oběma za odpověď. Nakonec mě pomohlo řešení Petana. Netušil jsem, že ve funkci LAG se dá v ORDER BY dávat více parametrů. Tímto se to vyřešilo.

 
Nahoru Odpovědět
3.3.2022 7:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.3.2022 7:57

Mozna by pomohlo, kdybys uvedl priklad vstupu a jaky ma byt vystup.

Jeste mne napadlo, ze chces treba, aby to bylo v presnem poradi. Jak se treba dela u vyhledavani, ze nektere vysledky, ze lepsi shoda s vyhledavacim slovem je nahore a ostatni niz.
A nebo mozna ti staci jen ten GROUP ("postupně se doplní všechny hodnoty ze sloupce name").
A nebo to chapu uplne spatne :)

 
Nahoru Odpovědět
3.3.2022 7:57
Avatar
Petan
Člen
Avatar
Odpovídá na František Horák
Petan:3.3.2022 13:26

Jinak tady je priklad jak by to melo byt spravne

https://www.mysqltutorial.org/…ag-function/

 
Nahoru Odpovědět
3.3.2022 13:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.