Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

MAm tabelę, z któej pobieram, któa ma kolumny:
data zapytania 'YYYY/RR'
data zainteresowania 'YYYY/RR'
ilosc

Mam tej tabeli wyrzucić dla danego miesiąca w danym roku zainteresowania wszystkie meisiące zapytania z ostatnich 12 miesięcy
Czyli przykłądowo jeśli interesuje mnie data zainteresowania 2012/4 to dla tej daty ma mi wyrzucić:
data_zainteresowania data_zapytania ilosc
2012/4 2011/5 151
2012/4 2011/6 146
2012/4 2011/7 122
2012/4 2011/8 5445
2012/4 2011/9 111
2012/4 2011/10 55
2012/4 2011/11 487
2012/4 2011/12 25
2012/4 2012/1 45
2012/4 2012/2 85
2012/4 2012/3 87
2012/4 2012/4 21

itd dla każdej daty zainteresowania
Dodatkowo, żeby było lepiej operować na liczbach rozbiłem te daty na rok i miesiąc funkcją SUBSTR wiec tabele wyjściowe powinny wyglądać:
rok_zainteresowania miesiac_zainteresowania rok_zapytania miesiac_zapytania ilosc

Dodam, że wszystkie wartości są w tabeli poczatkowej jako stringi zapiusywane w postaci YYYY/MM dlatego trudno mi tu operować na datach chyba, że ktoś wie jak bo jak usiłuję zmienić np 2012/7 na date to mi wywala błąd. Musiałyby być wszystkie meisiace zapisywane 2cyfrowo a nie są. Zrobiłęm takie zapytanie, ale jest błędne. Ktoś wie, jak to zrobić poprawnie?

SELECT
SUBSTR(data_zainteresowania, 1,4)::integer as rok_zaint,
SUBSTR(data_zainteresowania, 6,7)::integer as miesiac_zaint,
SUBSTR(data_zapytania, 1,4)::integer as rok_zapytania,
SUBSTR(data_zapytania, 6,7)::integer as miesiac_zapytania,
ilosc
FROM moja_tabela
WHERE IF (SUBSTR(data_zapytania, 1,4)::integer = SUBSTR(data_zainteresowania, 1,4)::integer,
SUBSTR(data_zapytania, 6,7)::integer <= SUBSTR(data_zainteresowania, 6,7)::integer,
SUBSTR(data_zapytania, 6,7)::integer +1<= SUBSTR(data_zainteresowania, 6,7)::integer)
ORDER BY data_zapytania ASC";

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Zły model danych zawsze prowadzi do takich potworków polegających na rzeźbieniu w gównie zamiast od początku wziąć się za sprzątanie.

Zamianę danych z tekstu na datę możesz zrobić tak:

SELECT to_date('2012/12', 'YYYY/MM'); 


A potem możesz znaleźć wszystkie wpisy z danego miesiąca np. tak:

SELECT * FROM x WHERE data_zainteresowania = to_date('2012/4', 'YYYY/MM'); 
Szymon G. edytował(a) ten post dnia 16.08.12 o godzinie 12:32
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Dzięki wielkie za podpowiedź :)

Teraz wygląda to mniej więcej tak:

SELECT
to_date(data_zainteresowania, 'YYYY/MM'),
to_date(data_zapytania, 'YYYY/MM'),
ilosc
FROM moja_tabelka
WHERE
to_date(data_zainteresowania, 'YYYY/MM') > to_date(data_zapytania, 'YYYY/MM')
AND

ORDER BY miesiac_zapytania DESC

I tutaj kolejne pytanie. Co wstawić w ANDzie żeby wyświetliło mi 12 ostatnich miesięcy?

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Patryk Malaca:
Dzięki wielkie za podpowiedź :)

Teraz wygląda to mniej więcej tak:

SELECT
to_date(data_zainteresowania, 'YYYY/MM'),
to_date(data_zapytania, 'YYYY/MM'),
ilosc
FROM moja_tabelka
WHERE
to_date(data_zainteresowania, 'YYYY/MM') > to_date(data_zapytania, 'YYYY/MM')
AND

ORDER BY miesiac_zapytania DESC

I tutaj kolejne pytanie. Co wstawić w ANDzie żeby wyświetliło mi 12 ostatnich miesięcy?


 to_date(data_zapytania, 'YYYY/MM') >= now() - interval '12 month' 

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Jeszcze można użyć overlaps ;)
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

dzięki ponowne
Mało dokładnie się wyraziłem. Chciałem aby pytanie wykonało się dla 12 ostatnich emisięcy licząc nie od dzisiaj a od daty zainteresowania
Po wykonaniu takiego zapytania:

SELECT
to_date(data_zainteresowania, 'YYYY/MM')
to_date(data_zapytania, 'YYYY/MM')
ilosc
FROM moja_tabelka
WHERE
to_date(data_zapytania, 'YYYY/MM') >= to_date(data_zainteresowania, 'YYYY/MM') - interval '11 month'

ORDER BY data_zainteresowania DESC, data_zapytania DESC

podało mi takie wyniki:

2010-05-01 2011-03-01 55
2010-05-01 2011-02-01 4
2010-05-01 2010-09-01 55
2010-05-01 2010-08-01 74
2010-05-01 2010-07-01 55
2010-05-01 2010-06-01 5
2010-05-01 2010-05-01 3
2010-05-01 2010-04-01 455
2010-05-01 2010-03-01 45
2010-05-01 2010-02-01 55
2010-05-01 2010-12-01 14
2010-05-01 2010-11-01 4
2010-05-01 2010-10-01 5
2010-05-01 2010-01-01 555
2010-05-01 2009-09-01 5
2010-05-01 2009-08-01 7
2010-05-01 2009-06-01 2
2010-05-01 2009-12-01 84
2010-05-01 2009-11-01 55
2010-05-01 2009-10-01 554

Czyli jak widać dla maja 2010 chciałem aby mi podało miesiące zapytania od czerwca 2009 do maja 2010 a tu mi wywaliło wszystkie, które miało.

Wydaje mi się że porównanie dat niei działa w tym przykładzie

W dodatku sortuje tak jakby data byłą typu string a nie date bo styczeń jest po a nie przed październikiemPatryk Malaca edytował(a) ten post dnia 16.08.12 o godzinie 14:06

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Przecież data_zainteresowania to string, to jak ma niby sortować jak robisz:

ORDER BY data_zainteresowania


Jakbyś zrobił tak, to by sortowało jakby to była data:

ORDER BY to_date(data_zainteresowania, 'YYYY/MM')
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Super :))))
Wielkie dzięki za cierpliwość do mnie i moich błędów początkującego :)

SELECT
to_date(data_zainteresowania, 'YYYY/MM'),
to_date(data_zapytania, 'YYYY/MM'),
ilosc
FROM moja_tabelka
WHERE
to_date(data_zapytania, 'YYYY/MM') >= to_date(data_zainteresowania, 'YYYY/MM') - interval '11 month'
AND to_date(data_zapytania, 'YYYY/MM') < to_date(data_zainteresowania, 'YYYY/MM')
ORDER BY to_date(data_zainteresowania, 'YYYY/MM'), to_date(data_zapytania, 'YYYY/MM')

Mam jeszcze jedno pytanie:

Teraz wyrzuca mi tabelę w postaci:
data_zapytania data_zainteresowania ilosc
2010-05-01 2010-05-01 45

a chciałbym, żeby wyrzucało mi tak jak na początku tematu pisałem:
rok_zapytania miesiac_zapytania rok_zainteresowania miesiac_zainteresowania ilosc

W jaki sposób tego dokonać?

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Patryk Malaca:
Super :))))
Wielkie dzięki za cierpliwość do mnie i moich błędów początkującego :)

SELECT
to_date(data_zainteresowania, 'YYYY/MM'),
to_date(data_zapytania, 'YYYY/MM'),
ilosc
FROM moja_tabelka
WHERE
to_date(data_zapytania, 'YYYY/MM') >= to_date(data_zainteresowania, 'YYYY/MM') - interval '11 month'
AND to_date(data_zapytania, 'YYYY/MM') <
> to_date(data_zainteresowania, 'YYYY/MM')
ORDER BY to_date(data_zainteresowania, 'YYYY/MM'), to_date(data_zapytania, 'YYYY/MM')

Mam jeszcze jedno pytanie:

Teraz wyrzuca mi tabelę w postaci:
data_zapytania data_zainteresowania ilosc
2010-05-01 2010-05-01 45

a chciałbym, żeby wyrzucało mi tak jak na początku tematu pisałem:
rok_zapytania miesiac_zapytania rok_zainteresowania miesiac_zainteresowania ilosc

W jaki sposób tego dokonać?

to_char()
http://www.postgresql.org/docs/9.1/static/functions-fo...

 to_char(date, 'YYYY/MM') 
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Czy tak to powinno wyglądać?

SELECT
to_char(data_zainteresowania, 'YYYY')::integer as rok_zainteresowania,
to_char(data_zainteresowania, 'MM')::integer as miesiac_zainteresowania,
to_char(data_zapytania, 'YYYY')::integer as rok_zainteresowania,
to_char(data_zapytania, 'MM')::integer as miesiac_zainteresowania,
ilosc
FROM ( SELECT
to_date(data_zainteresowania, 'YYYY/MM'),
to_date(data_zapytania, 'YYYY/MM'),
ilosc
FROM moja_tabelka
WHERE
to_date(data_zapytania, 'YYYY/MM') >= to_date(data_zainteresowania, 'YYYY/MM') - interval '11 month'
AND to_date(data_zapytania, 'YYYY/MM') > to_date(data_zainteresowania, 'YYYY/MM')
ORDER BY to_date(data_zainteresowania, 'YYYY/MM'), to_date(data_zapytania, 'YYYY/MM'))
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Czy ktoś ma pomysł jak to powinno wyglądać bo w tej postaci nei chce mi działąć

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Patryk Malaca:
Czy ktoś ma pomysł jak to powinno wyglądać bo w tej postaci nei chce mi działąć

Nie chce działać, czyli? Jaki masz błąd, jakie masz objawy? Co to znaczy, że nie chce działać?
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

Błąd SQL:

ERROR: subquery in FROM must have an alias
LINE 7: FROM (
^
HINT: For example, FROM (SELECT ...) [AS] foo.

konto usunięte

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

spróbuj tak:


WITH data AS (
SELECT
to_date(data_zainteresowania, 'YYYY/MM') as data_zainteresowania,
to_date(data_zapytania, 'YYYY/MM') as data_zapytania,
ilosc
FROM
moja_tabelka
WHERE
to_date(data_zapytania, 'YYYY/MM') >= to_date(data_zainteresowania, 'YYYY/MM') - interval '11 month'
AND to_date(data_zapytania, 'YYYY/MM') > to_date(data_zainteresowania, 'YYYY/MM')
)
SELECT
extract(year from data_zainteresowania) as rok_zainteresowania,
extract(month from data_zainteresowania) as miesiac_zainteresowania,
extract(year from data_zapytania) as rok_zainteresowania,
extract(month from data_zapytania) as miesiac_zainteresowania,
ilosc
FROM data
ORDER BY data_zainteresowania, data_zapytania;
Patryk Malaca

Patryk Malaca Obecnie pracuję na
stażu

Temat: Pobranie z bazy danych 12 ostatnich emisięcy dla danego...

ten sposób działa - mimo, że kompletnie nie wiem co się tu dzieje.
Bardzo dziękuję za pomoc :)

Następna dyskusja:

Strumieniowe Bazy Danych




Wyślij zaproszenie do