Výběr nejnovějších 5 záznamů tabulky a operace s nimi – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výběr nejnovějších 5 záznamů tabulky a operace s nimi – MS SQL – Fórum – Programujte.comVýběr nejnovějších 5 záznamů tabulky a operace s nimi – MS SQL – Fórum – Programujte.com

 

cardicek
~ Anonymní uživatel
2 příspěvky
13. 8. 2018   #1
-
0
-

Ahoj, mám tabulku szasoby, která obsahuje pro různý "cmat" několik záznamů s cenou skladu a potřeboval bych z této tabulky vybrat 5 nejnovějších řádků (datum_pos_prijmu), vypočítat průměr, průměr bez max min(v případě, že bude počet řádků > 3) sloučený pro jednotlivé cmat záznamy.

select cmat, avg(sklad_cenamj) as prumer,
iif(count(*)>=3,(sum(sklad_cenamj)-max(sklad_cenamj)-min(sklad_cenamj))/(count(*)-2),avg(sklad_cenamj)) as prumerBezMM, max(datum_pos_prijmu)
 from (select c.cmat, c.sklad_cenamj,c.datum_pos_prijmu from szasoby c order by datum_pos_prijmu desc) d  group by cmat

Tento příkaz funguje, ale pokud má nějaký cmat např 8 řádků, vypočítá to ze všech řádků. Jakákoliv snaha o top 5 nebo něco podobného vyhodí jen 5 jednotlivých součtů cmat.

Pro mě to má smysl jen v rovině sql příkazu, přes proceduru by to šlo, ale pro mě nepoužitelné.

Díky za pomoc

Nahlásit jako SPAM
IP: 89.111.104.–
MilanL+1
Grafoman
14. 8. 2018   #2
-
0
-

#1 cardicek
ahoj, zkus hledat inspiraci třeba pro MSSQL zde taková vychytávka

http://biportal.cz/sql-over/

použij over na té nejnižší úrovni pro číslování řádků pro jednotlivé cmat

pak si místo IF dej ve vyšší úrovni v té agregaci podmínku where řádek <6

nemám jak to odzkoušet ale mohlo by to vypadat nějak takto  

select cmat, avg(sklad_cenamj) as prumer,
(sum(sklad_cenamj)-max(sklad_cenamj)-min(sklad_cenamj))/(count()-2) as prumerBezMM,
 max(datum_pos_prijmu)

from (select c.cmat, c.sklad_cenamj,c.datum_pos_prijmu, 
ROW_NUMBER() OVER (PARTITION BY c.cmat ORDER BY c.datum_pos_prijmu desc) AS radek 
count() over (PARTITION BY c.cmat) AS radku
from szasoby c) d  
group by cmat
where radku>2 and radek<6
Nahlásit jako SPAM
IP: 91.139.9.–
peter
~ Anonymní uživatel
4016 příspěvků
14. 8. 2018   #3
-
0
-

Mas tam 'iif'.

Ja bych zkusil neco proceduru pro:
[group_id] = SELECT cmat FROM tabulka
[top5] = SELECT id FROM tabulka WHERE group_id = [group_id] ORDER BY datum DESC LIMIT 5
cyklus + UNION_ALL + LEFT JOIN dalsi data pro id radku

Bez procedury to potrebujes seradit group_id a podle datumu. A pak nejak ocislovat top 5 pro danou skupinu. A pak z toho odstranit vse, co nema cislo.
To ocislovani by slo jako novy sloupec COUNT(group_id) AS cislo. A pak tam das kolem SELECT a vyfultrujes to  jako WHERE cislo<5. Nevim, chtelo by to testnout. Treba COUNT ma prednost pred ORDER BY, to by pak neslo.
Over, viz Milan, neznam, mozna to jim jde resit nejak jednoduseji.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
MilanL+1
Grafoman
14. 8. 2018   #4
-
0
-

#3 peter

Proceduru právě nechtěl, asi nemá přístup k jejich definici

ten over by to právě měl řešit 

ROW_NUMBER() OVER (PARTITION BY c.cmat ORDER BY c.datum_pos_prijmu desc) AS radek 
- řeší číslování řádků seskupení dle cmat a seřazení dle datumu sestupně - pro každý cmat od 1 až x

count() over (PARTITION BY c.cmat) AS radku
- počet řádků pro každý cmat zvlášť

zkusil bych ten sub select nejdřív samosattně jestli to vyhodí správnou tabulku.

Nahlásit jako SPAM
IP: 91.139.9.–
cardicek
~ Anonymní uživatel
2 příspěvky
15. 8. 2018   #5
-
0
-

#4 MilanL
Ahoj, díky všem za pomoc, přes ten OVER to asi půjde. Zatím jsem to musel vyřešit jinak, protože dotaz musí být i pro Firebird, ale zatím máme verzi 2,5 a ta OVER() nepodporuje, tedy po upgradu na Firebird 3 to vyzkouším a zaktualizuji vlákno, pokud to ještě půjde.

Ještě jednou všem díky za pomoc.

Nahlásit jako SPAM
IP: 89.111.104.–
MilanL+1
Grafoman
15. 8. 2018   #6
-
0
-

#5 cardicek
no to jsi nenapsal, že je to pro firebird, ono tu není vlákno tak když to dáš pod MSSQL tak je třeba to napsat.

FireBird by to měl podporovat od verze 3.0.3

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý