Jak w tym przypadku optymalnie wyszukać dane?

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
emil
Posty: 49
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 11 times
Been thanked: 17 times

Jak w tym przypadku optymalnie wyszukać dane?

Post autor: emil »

Nie mam pomysłu, w jaki sposób optymalnie odpytać tabelę wewnętrzną o dane, dodatkowo ją nieco sprzątając.

W wewnętrznej tabeli, jak widać na screenach, mam sytuację, w której część rekordów (żółta) ma wspólne wartości w kolumnach a-f. Wiem, że wspólne wartości ZAWSZE występują (o ile występują) dokładnie w a-f. Muszę skonstruować logikę, która pozwoli mi:
- znaleźć wpisy ze wspólnym zakresem danych a-f,
- stworzyć dodatkowy wpis z wartościami a-f tak jak było, ale: chcę zmodyfikować kol7 oraz w kol8 i kol9 podać sumy znalezionych rekordów ze wspólnym mianownikiem,
- po dodaniu nowego wiersza, muszę usunąć „źródłowe” wiersze, czyli te, które pierwotnie były oznaczone na żółto.

Stworzenie samego algorytmu nie jest problemem, natomiast od której strony bym nie zaczynał, to nie podoba mi się konstrukcja rozwiązania. Pętle w pętlach pętlę poganiają.

Warto wspomnieć, że tabela wewnętrzna będzie zawierała 60 000 – 100 000 pozycji. Nie do końca uśmiecha mi się budowa rozwiązania, w którym każdy element z każdym będzie porównywany w celu sprawdzenia, czy gdzieś występuje jego „częściowy” dubel.

Czy ktoś z Was mierzył się z tego typu problemem?
Będę wdzięczny za sugestie, jak w miarę optymalnie podejść do rozwiązania problemu.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

ZETKA
Posty: 51
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 44 times

Re: Jak w tym przypadku optymalnie wyszukać dane?

Post autor: ZETKA »

Pomijając kolumnę G problem rozwiązuje prosty COLLECT.
Kolumną G, w zależności o tego jak ma być obsłużona można manipulować w oparciu o sy-tabix.
Pozdrawiam,
Krzysiek

yacol
Posty: 525
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 8 times
Been thanked: 124 times

Re: Jak w tym przypadku optymalnie wyszukać dane?

Post autor: yacol »

Czy liczba rekordów z taką samą wartością kolumn A-F będzie zawsze większa od 1? Przykładowo na Twoim zrzucie ekranowym (na żółto) zaznaczone są 4 rekordy. Rozumiem, że może być ich 2, 5, 12, 666, ... itd ale zawsze więcej niż 1, tak? Oczywiście poza przypadkiem gdy jest 0 ale to oznacza, że nie ma rekordów z powtórzonymi wartościami w kolumnach A-F.
Pozdrawiam,

Jacek Witczak
http://novertio.pl

emil
Posty: 49
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 11 times
Been thanked: 17 times

Re: Jak w tym przypadku optymalnie wyszukać dane?

Post autor: emil »

90% rekordów będzie poj. wpisami (bez powtórzeń). Pozostałe 10 % to wielokrotne wpisy, zazwyczaj w przedziale 2-5 wpisów.

yacol
Posty: 525
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 8 times
Been thanked: 124 times

Re: Jak w tym przypadku optymalnie wyszukać dane?

Post autor: yacol »

To tak na szybko:

tabela z danymi gdzie występują "rekordy na żółto :)" to tabela_źródłowa
tabela z danymi przygotowanymi tak jak opisałeś w swoim poście to tabela_wynikowa

wykorzystałbym konstrukcję pętli po grupach rekordów: https://help.sap.com/doc/abapdocu_752_i ... oup_by.htm

loop at tabela_źródłowa ... group by kol1 kol2 kol3 kol4 kol5 ... X = group size ...

loop at group ....
ta pętla wykona się tyle razy ile jest rekordów w grupie:
1 raz dla każdego rekordu z niepowtarzalną zawartością kolumn A-F
X razy dla każdej grupy rekordów z taką samą zawartością kolumn A-F

endloop.

jeśli X = 1 to znaczy, że mamy do czynienia z rekordem z niepowtarzalną zawartością kolumn A-F i go po prostu dodajesz
do tabela_wynikowa
w przeciwnym wypadku do tabela_wynikowa dodajesz rekord z posumowanymi wartościami z kolumn A-F obliczonymi w loop at group ...

endloop.
Pozdrawiam,

Jacek Witczak
http://novertio.pl

emil
Posty: 49
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 11 times
Been thanked: 17 times

Re: Jak w tym przypadku optymalnie wyszukać dane?

Post autor: emil »

Finalnie użyłem jeszcze innego rozwiązania, wykorzystując dodatkową wewnętrzną tabelę. W skrócie:
- biorę wszystkie rekordy do IT_temp
- usuwam duble

(mam teraz listę unikalnych rekordów)

- loopem na it_temp sprawdzam, czy w bazie jest więcej niż jeden rekord dla każdego z wpisu z it_temp
- jeśli tak - oznaczam sobie taki rekord by na podstawie postawionej flagi dalej obrabiać dane (nie tylko sumować któreś wartości, jak się okazało).

Na szczęście przy mojej skali danych, nie czuć jakichś problemów z wydajnością.