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;
Odp: Funkcja przeszukująco - porównująca
Dziękuję za pomoc. Niestety funkcji lag i lead nie jestem w stanie użyć . 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.
Odp: Funkcja przeszukująco - porównująca
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)
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;
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.
Odp: Funkcja przeszukująco - porównująca
Możesz dać jakiś przykład?
Sprawdź czy nie ma takiego wiersza w danych z twojego selecta.
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.
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
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.
Odp: Funkcja przeszukująco - porównująca
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ę , z PSQL-em styczności wcześniej nigdy nie miałem, s MySQL-em tak ale aż tak rozbudowanych kwerend nie pisałem.
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;
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ą .
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
)
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'
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)
)