Filtrowanie i wyszukiwanie powtarzajaczch sie rekordow

0

Witam wszystkich.

Mam dośc poważny problem przy pisaniu bazy a mianowicie.
Pewna kolumna ma wpisy które wyglądają tak

aa
aa
bb
bb
cc
cc
aa
aa
bb
bb
itd.

Chciałbym aby w innej klumnie baza dopisywała cyfrę do wartości z kolumny tak aby każdy grupa był unikatowa.np (aa1,bb1,cc,1,aa2,bb2 itd)
Potrzebuje napisac program który bedzie porównywał rekord z rekordem nastepnym jezeli beda takie same to niech porowna jeszcze nastepny rekord. I to wszystko zapetlic dopuki kolejny rekord nie bedzie inny niż te wyżej. Jeżeli warunek przerwania pętli bedzie spełniony to niech dopisze cyfrę do wartośc rekordow. Należeło by rownież stworzy tabelę z numerkami jakie zostały już przypisane aby się nie powtórzyły.
Dodam jeszcze że buduje bazę w ACCessie a rowiązanie nalepiej by było napisac w visual basic ale AQL też może byc.
Proszę o pomoc

0

starałem się Cie zrozumieć, ale nie dałem rady.

To masz w tabeli
aa
aa
bb
bb
cc
cc
aa
aa
bb
bb

a co ma być docelowo zamiast tego??

BTW

dopóki i chyba SQL a nie AQL

0

kolumna z
aa
bb
cc
aa
bb
itd. ma zostac
Powinna powstaż w kolumna z
aa1
bb1
cc1
aa2
bb2
itd.

0

dodatkowa tabelka z polami
wartość
numer

w wartość masz to co było w polu przed update a w numer aktualnie dodawany numer. Potem dla każdego pola robisz dwa update -

  1. update tabelka set kolumna = kolumna || (select numer from tab_z_numerami where wartosc = kolumna)
  2. update tab_z_numerami set numer = numer + 1 where wartosc = kolumna

to tak ogólnie

0

Widze że wiesz oco chodzi ale jak możesz troche bardziej szczegułowo.
oczekuje takiego rozwiązania
Tak powinna wyglądac Kolumna po zmianach
aaa1
aaa1
bbb1
bbb1
ccc1
aaa2
bbb2
ccc2
ccc2
aaa3

Napisze co zrozumiałem.
Tabela pierwsza

Tabela "wartosc_poczatkowa"
Kolumna "Numer_poczatkowy"
aaa
aaa
bbb
bbb
ccc
aaa
bbb
ccc
ccc
aaa

Tabela druga Tabela"wartosc_koncowa" Kolumna "Numer_poczatkowy" oraz "numer"

Możesz jeszcze raz podac te update i gdzie je podczepi

0

tabela1 - tabela z surowymi danymi, pole wartosc
tabela2 - tabela z danymi 'po obróbce', pole wartosc
tabela3 - tabela z danymi do zamiany, pola wartosc i numer

tabela1      tabela2       tabela3
wartosc      wartosc       wartosc  numer
-------      -------       -------------
aaa          aaa1          aaa      4
aaa          aaa2          bbb      3
bbb          bbb1          ccc      3
bbb          bbb2
ccc          ccc1
aaa          aaa3
bbb          bbb3
ccc          ccc2
ccc          ccc3
aaa          aaa4

robisz tak (nie wiem jak wyglądają procedury w accesie i jak tam się odwołać do każdego rekordu z zapytania więc będzie schematycznie)

for select wartosc from tabela1 t1 do
begin
  if (select count(*) from tabela3 t3 where t3.wartosc = t1.wartosc) = 0 then
    insert into tabela3 values (t1.wartosc, 1);
  insert into tabela2 values (t1.wartosc || (select numer from tabela3 t3 where t3.wartosc = t1.wartosc));
  update tabela3 set numer = numer + 1 where t3.wartosc = t1.wartosc;
end;

zapewne będziesz musiał to rozbić na kilka zapytań, dodać parę zmiennych itp.

A gdzie to podpiąć - gdzie chcesz

0

Musiał chyba źle wytłumaczyć.
Celowo podałem grupy powtarzających sie składnii np. aaa,aaa
dla takiej grupy nr powinien być ten sam czyli aaa1,aaa1
dla kolejnych grup następny numer, może się zdarzyć, że dana grupa bedzie się składała
z 1 lub 5 takich samych wartoći np
aaa
aaa
aaa
bbb
bbb
bbb
aaa
ccc
Wynik powinien być
aaa1
aaa1
aaa1
bbb1
bbb1
bbb1
aaa2
ccc1
Mój pierwszy opis problemu zawirał próbę wyjaścnienie algorytmu któy mósiałby być napisany w SQL lub VB, który najprościej mówiąć ma sprawdzać następny rekord i albo zaliczyć do danej grupy albo otworzyć nową.

Twoja odpowiedź rozwiązuje problem zapisywania ostationo użytego numeru dla powatarzających sie wartości, ale dalej niewiem jak sprawdzać nastepny rekord.

0

no to coś takiego

var numer;
var wart := '';
FOR SELECT wartosc FROM tabela1 t1 do
begin
  IF wart <> t1.wartosc then
  begin
    IF (SELECT count(*) FROM tabela3 t3 WHERE t3.wartosc = t1.wartosc) = 0 then
    begin
      wart := 1;
      INSERT INTO tabela3 VALUES (t1.wartosc, wart);
    end
    ELSE
    begin
      wart := (SELECT numer FROM tabela3 t3 WHERE t3.wartosc = t1.wartosc) + 1;
      UPDATE tabela3 SET numer = wart WHERE t3.wartosc = t1.wartosc;
    end;
  end;
  INSERT INTO tabela2 VALUES (t1.wartosc || wart);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1