1

Temat: Funkcja przeszukująco - porównująca

2

Odp: Funkcja przeszukująco - porównująca

Jeśli Cię dobrze zrozumiałem to powinno być coś takiego , musisz mieć jednak kolumnę, w której określisz porządek na podstawie którego baza ustali, który rekord jest przed którym w moim przykładzie to kolumna lp

PS O ile dobrze pamiętam musisz mieć bazę w wersji co najmniej 8.4

with tabela (lp,x,y) as (values
(1,1,2)
,(2,0,1)
,(3,1,0)
,(4,0,1)
,(5,0,1)
,(6,0,0)
)
select lp,x,y
from (select t.*
            ,lag(y) over (order by lp) as poprz_y
            ,lead(x) over (order by lp) as nast_x
        from tabela t) d
where coalesce((d.x = 0 and poprz_y = 0),false)= false
  and coalesce((d.y = 0 and nast_x = 0),false) = false;

3

Odp: Funkcja przeszukująco - porównująca

Dziękuję za pomoc. Niestety funkcji lag i lead nie jestem w stanie użyć sad. Już patrzyłem i ona działa wyłącznie na danych przechowywanych w tej samej partycji czego ja nie robię i nie jestem w stanie sprawdzić czy są one tak przechowywane. Dlatego muszę szukać innego rozwiązania.

4

Odp: Funkcja przeszukująco - porównująca

5

Odp: Funkcja przeszukująco - porównująca

Może inaczej, na chwilę obecną mam coś takiego:

select * from
(SELECT
WART_1,
WART_2,
WART_3,
WART_4,
WART_5,
WART_6,
WART_7,
WART_8,
WART_9,
WART_10
FROM table_1 INNER JOIN table_2 ON table_2.WART_7 = table_1.WART_3
order by WART_1 asc) as dane

W kolumnie WART_5 siedzi pierwsze 0 w kolumnie WART_2 może siedzieć drugie 0. I teraz w momencie natrafienia na 0 w kolumnie WART_5 sprawdzam czy w wierszu powyżej w kolumnie WART_2 też jest 0. Jeśli tak to te wiersze pomijam, jeśli nie to je wyświetlam.

WART_1 jest wartością po której sortuję. Nie są to numery po kolei ale zawsze w sytuacji kiedy znajdę w kolumnie WART_5 0 i 0 będzie też w kolumnie WART_2 to kolumnna WART_1 będzie różniła się o 1. Dla przykładu, mamy kolumny gdzie WART_1 przyjmuje wartości:
3
5
7
34
44
56
57
78
To jeśli w wierszu 57 w kolumnie WART_5 wystąpi zero to nie ma możliwości aby kolumna WART_2 miała inny numer wiersza jak 56. Zawsze będzie miała o 1 mniejszy.

Ostatnio edytowany przez peter (2014-10-21 15:42:48)

6

Odp: Funkcja przeszukująco - porównująca

a to Ci działa?

with tabela as (SELECT
WART_1,
WART_2 as y,
WART_3,
WART_4,
WART_5 as x,
WART_6,
WART_7,
WART_8,
WART_9,
WART_10,
,row_number() over() as lp
FROM table_1 INNER JOIN table_2 ON raport_2.WART_7 = table_1.WART_3)
select *
from (select t.*
            ,lag(y) over (order by lp) as poprz_y
            ,lead(x) over (order by lp) as nast_x
        from tabela t) d
where coalesce((d.x = 0 and poprz_y = 0),false)= false
  and coalesce((d.y = 0 and nast_x = 0),false) = false;

7

Odp: Funkcja przeszukująco - porównująca

Właśnie nie do końca działa. Efekt mam obecnie taki że utworzył mi w tabeli dodatkowy wiersz pod tym gdzie znalazł te z zerami i wiersz powstał ze sklejenia WART_5 i WART_2. Tak jakby zdublował mi dokładnie ten wiersz gdzie WART_2 była 0.

8

Odp: Funkcja przeszukująco - porównująca

Możesz dać jakiś przykład?

Sprawdź czy nie ma takiego wiersza w danych z twojego selecta.

9

Odp: Funkcja przeszukująco - porównująca

Ok, moja wina ponieważ pochrzaniłem warunki ale mimo wszystko jest coś nie tak.Bo w wierszu gdzie w WART_5 mam 0 to jako wartość poprz_y mam WART_2 ale z tego samego wiersza a powinno być 0.

10

Odp: Funkcja przeszukująco - porównująca

patrz na rekordy w ten sposób
Jesli obserwujesz rekord o lp=100 to pole poprz_y będzie wartością WART_2 z rekordu o LP=99, a pole  nast_x będzie wartością WART_5 z wiersza o lp=101

pole LP w tym przypadku decyduje o kolejności wierszy które są brane do analizy

11

Odp: Funkcja przeszukująco - porównująca

No i wiem gdzie może być błąd. Czy dało by radę żeby przez wstawieniem row_number zrobić order by po WART_1? Bo na tym się wywala właśnie. Dlatego że aby mieć odpowiednio ułożone wiersze z wartościami WART_5 i WART_2 muszę zrobić order by po WART_1. Jak to zrobię po dodaniu row_number to mi rozwala kolejność. Czyli, najpierw sortuję po WART_1 i mam odpowiednio ułożoną tabelę a następnie dopiero do tak ułożonej jakbym dodał row_number to powinno być już ok.

12

Odp: Funkcja przeszukująco - porównująca

13

Odp: Funkcja przeszukująco - porównująca

Wiesz co, faktycznie, jak przeanalizowałem i poprawiłem warunek trochę bo miałem błąd to działa prawidłowo ale troszeczkę nie taki efekt chcę uzyskać. W tej chwili on po prostu tworzy mi obok dwie kolumny z poprz_y i nast_x wycinając wartości gdzie poprz_y i nast_x jest 0. Efekt który ja chciałem uzyskać to w ogóle żeby takich wierszy nie wyświetlać. Czyli np w wiersz 98 znalazł w kolumnie WART_5 - 0 i w wierszu 99 w kolumnie WART_2 też znalazł 0. Takie 2 wiersze są wycinane ze wszystkimi danymi które znajdują się w pozostałych kolumnach. Czyli wiersza 98 i 99 w ogóle nie wyświetlam. W tej chwili faktycznie w tej kolumnie popz_y i nast_x nie mam tych wartości z zerami ale niestety obok mam te pozostałe wiersze z kolumnami i tam te dane już występują. A chciałbym żeby tego w ogóle nie wyświetlać. Jeszcze próbowałem to INNER JOIN-em zrobić ale coś nie chce za bardzo działać. Do tego zapytania jeszcze dochodzi mi jeden warunek gdzie wycinam wiersze w których wartości z 2 kolumn nie znajdują się pomiędzy pewnym zakresem ale ten warunek mam i on działa. Teraz dodatkowo muszę dorzucić warunek którego dotyczy temat. Już 2 dni nad tym siedzę sad, z PSQL-em styczności wcześniej nigdy nie miałem, s MySQL-em tak ale aż tak rozbudowanych kwerend nie pisałem.

14

Odp: Funkcja przeszukująco - porównująca

Oto Ci chodziło?

with tabela as (SELECT
WART_1,
WART_2 as y,
WART_3,
WART_4,
WART_5 as x,
WART_6,
WART_7,
WART_8,
WART_9,
WART_10,
,row_number() over(order by WART_1) as lp
FROM table_1 INNER JOIN table_2 ON raport_2.WART_7 = table_1.WART_3)
select
WART_1,
y as WART_2,
WART_3,
WART_4,
x as WART_5,
WART_6,
WART_7,
WART_8,
WART_9,
WART_10
from (select t.*
            ,lag(y) over (order by lp) as poprz_y
            ,lead(x) over (order by lp) as nast_x
        from tabela t) d
where coalesce((d.x = 0 and poprz_y = 0),false)= false
  and coalesce((d.y = 0 and nast_x = 0),false) = false;

15

Odp: Funkcja przeszukująco - porównująca

Próbowałem tak już robić wczoraj ale dzieje się coś dziwnego bo w tabeli mam w sumie 3544 wiersze. Wynik zapytania zwraca mi 3538 wierszy no i super. Wszystko jest ok dlatego że powinien wyciąć mi 6 wierszy. Tylko kurcze nie wiem które mi wycina ponieważ w wyniku wiersze gdzie te 0 są, normalnie się wyświetlają sad.

16

Odp: Funkcja przeszukująco - porównująca

Jeśli chcesz zobaczyć odfiltrowane wiersze to w klauzuli WHERE napisz
not (
          coalesce((d.x = 0 and poprz_y = 0),false)= false
  and coalesce((d.y = 0 and nast_x = 0),false) = false
)

17

Odp: Funkcja przeszukująco - porównująca

Wiesz co, chyba znam problem. Mój INER JOIN coś szwankuje i mi wiersze w których akurat są te zera po prostu zdublował. Zaraz dojdę czemu.

---EDIT---
Doszedłem. Wiem czemu mi tak dubluje ale chyba potrzebuję już naprawdę ostatni raz Twojej pomocy przy sklejeniu dwóch zapytań. Do tego swojego muszę jeszcze dodać warunek:
where
(A BETWEEN B AND C)

I to musi się wykonać jeszcze przed tym drugim zapytaniem ale kurcze nie mam pomysłu jak to zrobić dlatego że kolumna z numerem wiersza powinna się dodać dopiero po tej mojej klauzuli where z tego względu że jak ją dodam wcześniej, później wykonam where to będę miał dziury w 'lp'

18

Odp: Funkcja przeszukująco - porównująca

zamień linie FROM table_1 INNER JOIN table_2 ON raport_2.WART_7 = table_1.WART_3)
na
FROM table_1 INNER JOIN table_2 ON raport_2.WART_7 = table_1.WART_3
WHERE (A BETWEEN B AND C)
)