Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Oracle LAG/LEAD Funktion falsche Sortierung? (https://www.delphipraxis.net/155186-oracle-lag-lead-funktion-falsche-sortierung.html)

David Martens 12. Okt 2010 11:18

Datenbank: Oracle • Version: 9 • Zugriff über: odbc

Oracle LAG/LEAD Funktion falsche Sortierung?
 
Folgendes vereinfachtes Problem:

Tabelle1:
Spalten:
Baustein, Funktion (beide VARCHAR/VARCHAR2)
LfdNrA (integer)

Tabelle2:
Spalten:
Name (VARCHAR/VARCHAR2)
LfdNrB (integer)
LfdNrA (aus Tabelle 1)

-----------------------------------------------
Hier die SQL:
SQL-Code:
for fkt_rec in (
select
  Baustein,
  LAG(Baustein, 1) over (order by Baustein, Funktion, Name) "PreBaustein",
  Funktion,
  LAG(Funktion, 1) over (order by Baustein, Funktion, Name) "PreFunktion",
  Name
from
  Tabelle1, Tabelle2
where
  Tabelle1.LfdNrA = Tabelle2.LfdNrA
-- Das order by ist anders als in der LAG Funktion
order by
  Baustein, Funktion, Name
) loop

  if fkt_rec."PreBaustein" is null
  then
    dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////');
    dbms_output.put_line('-- ' || fkt_rec.Baustein);
  end if;

  if fkt_rec.Baustein <> fkt_rec."PreBaustein"
  then
    dbms_output.put_line('');
    dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////');
    dbms_output.put_line('-- ' || fkt_rec.Baustein);
  end if;

  if fkt_rec.Funktion <> fkt_rec."PreFunktion" or fkt_rec."PreFunktion" is null
  then
    dbms_output.put_line('');
    dbms_output.put_line('-- ' || fkt_rec.Funktion);
    dbms_output.put_line('');
  end if;

  dbms_output.put_line(fkt_rec.Name);
end loop;
-----------------------------------------------

Es ist jetzt so das bei dem "großen" (letzten) order by die Sortierung anders ist als in den LAG Funktionen.
Beispiel: (Auszug)
Tabelle2.Name: test, test1, test2, test3, Test, Test1, TEst, TEst1, a, b, c, z, +a, +b

Die LAG Funktion sortiert so:
+a, +b, a, b, c, z, test, test1, test2, test3, Test, Test1, TEst, TEst1

Das "normale" order by:
a, b, c, test, Test, TEst, test1, Test1, TEst1, test2, test3, z, +a, +b

-----------------------------------------------
Lange Rede kurzer Sinn:
1. Muß ich das "große" order by einfügen weil die "Sortierung" das Daten mit der LAG Funktion ein Nebeneffekt ist?
2. Kann mir jemand sagen wie ich die Sortierung der LAG Funktion "gerichtigen" kann. (mit Lower() wird nur die Groß-/Kleinschreibung gelöst, aber nicht das Problem mit den Sonderzeichen)

Danke David

David Martens 12. Okt 2010 14:01

AW: Oracle LAG/LEAD Funktion falsche Sortierung?
 
Jetzt hab ich das Problem gelöst:

SQL-Code:
for fkt_rec in (
select
  Baustein,
  LAG(Baustein, 1) over (order by rownum) "PreBaustein",
  Funktion,
  LAG(Funktion, 1) over (order by rownum) "PreFunktion",
  Name,
  rownum
from
  (select
     Baustein,
     Funktion,
     Name,
     rownum
   from
     Tabelle1, Tabelle2
   where
     Tabelle1.LfdNrA = Tabelle2.LfdNrA
   order by
     Baustein, Funktion, Name, rownum)
order by
  rownum
) loop

  if fkt_rec."PreBaustein" is null
  then
    dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////');
    dbms_output.put_line('-- ' || fkt_rec.Baustein);
  end if;

  if fkt_rec.Baustein <> fkt_rec."PreBaustein"
  then
    dbms_output.put_line('');
    dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////');
    dbms_output.put_line('-- ' || fkt_rec.Baustein);
  end if;

  if fkt_rec.Funktion <> fkt_rec."PreFunktion" or fkt_rec."PreFunktion" is null
  then
    dbms_output.put_line('');
    dbms_output.put_line('-- ' || fkt_rec.Funktion);
    dbms_output.put_line('');
  end if;

  dbms_output.put_line(fkt_rec.Name);
end loop;
Im Subselect wird einmalig und richtig die Sortierung festgelegt und kann somit von der LAG Funktion nicht mehr durcheinander gebracht werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz