Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Letzter Datensatz ermitteln auf Basis von 3 Feldern (https://www.delphipraxis.net/208169-letzter-datensatz-ermitteln-auf-basis-von-3-feldern.html)

mjustin 21. Jun 2021 16:53

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Zitat:

Zitat von haentschman (Beitrag 1491318)

Mit sowas habe ich Bauchschmerzen. Wenn man MSSQL bleibt, ok...bei einem Wechsel des DBMS funktioniert das ganze nicht mehr. Deshalb stehe ich auf Standard SQL...:wink: (KISS)

Da ist nichts MS SQL spezifisches, Fensterfunktionen sind schon einige Jahre im SQL Standard enthalten und werden von nicht wenigen Datenbanken auch unterstützt.

haentschman 21. Jun 2021 17:16

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
:oops:
z.B. FB. https://firebirdsql.org/file/documen...ndowfuncs.html
...man sollte ab und zu: RTFM. :stupid:

jobo 21. Jun 2021 18:33

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Wie schon gesagt wurde, Window Functions sind SQL Standard, schon relativ lange.
Die Bedenken sind leider nicht ganz unberechtigt. Denn Standard hin oder her, welcher Hersteller wieviel davon ab welcher Version seines System implementiert hat, ist eine ganz andere Frage. Ich meine, selbst bei SQLite ist es seit einiger Zeit verfügbar.
So oder so, sie sind -sofern verfügbar- jeder "handgemachten" Variante vorzuziehen. Nicht nur die Formulierung ist eleganter und übersichtlicher, die Engines können auch viel besser damit optimieren und liefern viel effizienter und schneller Ergebnisse zurück. Man gewinnt also nur, wenn man sie einsetzt.
Und ja, das hier ist ein Fall für Window Functions.

Piro 21. Jun 2021 19:07

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Voll cool.

Vielen Dank an alle.

Leider leidet die Performance der Abfrage, da ich einige Millionen Datensätze habe.

Ich habe das Problem jetzt ausgelagert und lasse es in der Programmlogik des Datenabziehers erledigen.

Danke nochmal an alle.

Geniales Forum. Man bekommt immer gute Hilfestellungen.

generic 21. Jun 2021 21:00

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Wie wäre es mit:
Code:
select
[MaterialNr], [BDatum], [BFolge],
case
when ROW_NUMBER() over (PARTITION by [MaterialNr] order by [BDatum] desc, [BFolge] desc)=1 then 'J'
else 'N'
end as KZ
from [dbo].[piro]
order by 1,2,3

Ergebnis:
Code:
111111111   2016-02-02   1   N
111111111   2016-02-17   2   N
111111111   2016-03-08   1   N
111111111   2016-03-11   1   J

222222222   2016-09-29   1   N
222222222   2016-09-29   2   N
222222222   2016-09-29   3   J

333333333   2015-01-20   1   N
333333333   2021-05-17   1   J
Wenn du kannst mach einen ClusterIndex auf [MaterialNr], [BDatum] desc, [BFolge] desc

Piro 22. Jun 2021 06:05

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
@generic

Genial. Die Performance mit dem Clustered Index ist sagenhaft.

Vielen vielen Dank. Genau das habe ich gesucht.

jobo 22. Jun 2021 06:46

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Ja, die Performance Window Functions ist idR viel besser, als die der Workarounds / Handarbeit.
Aber wenn Du mit millionen Datensätzen arbeitest, kostet ein solcher Index auch etwas Platz. Wenn du den hast, egal, wenn nicht, vielleicht mal schauen, was schon da ist an Indizierung und kürzen, entweder im "Bestand" der Indices bei Überlappung oder bei dem neuen von rechts nach links, eine Spalte weniger kann schon eine Menge Platz sparen und ggF. auch Insertperformance bringen (spürbar bei Masseninserts)
Was natürlich auch helfen würde, ist die massive Einschränkung der Grundmenge. Sind immer potentiell alle Mio DS betroffen? Oder reicht eine Einschränkung auf z.B. das aktuelle Geschäftsjahr? ..?

Piro 22. Jun 2021 13:24

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Danke für den Nachtrag.

Es müssen immer alle Sätze berücksichtigt werden. Die aktuelle Lösung passt erstmal.

Vielen Dank nochmal an alle.

generic 23. Jun 2021 15:01

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
 
Du solltest dir das trotzdem mal im Profiler anschauen, ich konnte nur mit "Glaskugel" arbeiten.
Wenn du kannst, lass die äußere Sortierung weg.

Wenn du nach Datum oder Artikel filterst, kann kann man auch noch über Partitionen nachdenken (wenn das eure SQL-Server Lizenz hergibt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.
Seite 2 von 2     12   

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