Topic: GROUP BY rinkti pagal datą

Sveiki,

Situacija tokia:

SELECT count
FROM lentele
GROUP BY count
ORDER BY import_date DESC

Tokia turėtų būti užklausa, t.y kad reikia išrinkti iš lentelės visus naujausius skirtingus kiekius. (kad jeigu yra keli vienodi įrašai, kad paimtų patį naujausią) Bet su šia užklausa jis tiesiog daro GROUP BY ir į ORDER BY visai nebežiūri.


Gal kas kokia mintį turi ? ;)

Re: GROUP BY rinkti pagal datą

ORDER BY rikiuoja rezultatą, o ne grupavimo metu grupėje esančias reikšmes.

Jeigu pas tave "naujausias" yra konkreti import_date tinkanti daugeliui count reikšmių, tai gal tiktu tokia užklausa:

SELECT DISTINCT count
FROM lentele
WHERE import_date = (SELECT MAX(import_date) FROM lentele)

Re: GROUP BY rinkti pagal datą

ši užklausa man išrenka tiesiog naujausią įrašą.

O pas mane tokie duomenys:

count | import_date
1       | 2012-10-01
1       | 2012-10-02
2       | 2012-10-03
2       | 2012-10-04

Ir man turėtų išrinkti šias eilutes:
1       | 2012-10-02
2       | 2012-10-04

Re: GROUP BY rinkti pagal datą

Na tai aš ir rašiau "jeigu", nes tu iš pradžių nenurodei konkrečiai kokia pas tave situacija.

Tau dabar yra tik vienas kelias - pasirašyti užklausą, kuri išrenka kiekvienam count "naujausią" datą: grupuoji pagal count ir išrenki MAX(import_date). Tada gautą užklausą jungi su ta pačia lentelę pagal import_date ir turėsi norimus count'us. (-;

Re: GROUP BY rinkti pagal datą

Nelabai supratau tamstos minties. Gal būtų galima SQL užklausą ?

Mano supratimu galimi tokie variantai:

SELECT count FROM lentele GROUP BY count

Tada cikle:

SELECT * FROM lentele WHERE count='count' ORDER BY import_date DESC LIMIT 1

Kitas variantas, kuris turbūt bus "lengvesnis" (1 SQL užklausa):

SELECT * FROM lentele ORDER BY import_date DESC

Cikle naujausia rezultatą išsaugoti masyve ir radus naujesnį jį vėl atnaujinti.

Re: GROUP BY rinkti pagal datą

Ciklo nereikia, vienos užklausos rezultatus galima SQL'o pagalba apjungti vėl su norima lentele ar kitais rezultatais - tam yra JOIN operatorius.

Re: GROUP BY rinkti pagal datą

Nu kažkaip nesusgraibau :-/

SELECT A.price_id, A.count, A.import_date
FROM lentele AS A
   LEFT OUTER JOIN lentele AS B ON A.count = B.count
WHERE A.item_id='26'
GROUP BY A.count
ORDER BY B.import_date DESC

Re: GROUP BY rinkti pagal datą

Tu dabar tiesiog sujungei dvi lenteles, o aš rašiau, kad reikia sujungti užklausos rezultatą (kas realiai yra laikina lentelė) tu kita lentele.

Kitą vertus žiūriu į tavo duomenis ir manau, kad čia pas tave YRA kažkokių problemų.

Jeigu pas tave tie patys kiekiai yra skirtingomis datomis, tai paaiškink, kuo skiriasi "naujausias" kiekis, nuo "seniausio" tokio pat kiekio? Jeigu abiem atvejais tas kiekis yra "2", tai jokio skirtumo kada jis buvo importuotas, tau reikia būten "2".

Re: GROUP BY rinkti pagal datą

Skirtumas yra kainoje ;)

Re: GROUP BY rinkti pagal datą

Tai apie kainą niekur nerašei. Rašei, kad tau reikia naujausių count'ų.

Re: GROUP BY rinkti pagal datą

Man reikia naujausios kainos, tuo pačiu gaunas, kad reikia to naujausio count'o. Taigi viskas išlieka taip pat :)

Re: GROUP BY rinkti pagal datą

Ne taip pat. Gauti naujausią count'ą tolygu gauti seniausią count'ą. Taigi tau juos gauti užtenka:

SELECT count FROM lentele GROUP BY count

O paimti susijusią informaciją iš kitų stulpelių tai jau, kaip sakiau reikia atlikti kažkokius tai jungimus (jeigu netinka jokia agregatinė funkcija). Tarkim gauti konkrečių count'ų naujausias datas užtenka MAX() funkcijos. Rezultate užklausa gaunasi tokia:

SELECT count, MAX(import_date) FROM lentele GROUP BY count

Ko pasekoje turi unikalius countus ir naujausias jų datas, kokios problemos? (-;

13 (edited by BigBug 2012-10-31 11:38:42)

Re: GROUP BY rinkti pagal datą

Tamstos tiesa, gaunasi, jog price_id yra aktualus užklausoje.

Ir jeigu mes parašysime:

SELECT price_id, count, MAX(import_date), FROM lentele GROUP BY count

Rezultatai bus blogi :-/

Nors teoriškai gal sueitų tokia lentelė:

SELECT MAX(price_id), count FROM lentele GROUP BY count

Kadanti price_id yra INCREMENT, tai visada ištrauks didžiausia t.y naujausia. Bet jeigu dar prirašysiu kitus stulpelius, kaip "kaina" , "dar kasnors", tuomet rezultatai bus nevisiškai teisingi.

Re: GROUP BY rinkti pagal datą

Problema išspręsta:

SELECT t1.* FROM table_one t1 WHERE t1.price_id IN (SELECT MAX(t2.price_id) FROM table_one t2 WHERE t2.item_id =  '26' GROUP BY t2.count)

Re: GROUP BY rinkti pagal datą

Iki visiškos laimės reikėtų IN () struktūrą perdaryti į JOIN. čia tam, kad greičiau veiktų - jeigu neaktualu - nevermind.

Re: GROUP BY rinkti pagal datą

Bendrai lentelėje įrašų neturėtų būti daugiau nei 1000 ir atfiltruotų skaičius nedaugiau nei 10.

Re: GROUP BY rinkti pagal datą

Tada visiskai dzin