AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Letzter Datensatz ermitteln auf Basis von 3 Feldern
Thema durchsuchen
Ansicht
Themen-Optionen

Letzter Datensatz ermitteln auf Basis von 3 Feldern

Ein Thema von Piro · begonnen am 21. Jun 2021 · letzter Beitrag vom 23. Jun 2021
Antwort Antwort
Seite 2 von 2     12   
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#11

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 17:53

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... (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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#12

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 18:16

z.B. FB. https://firebirdsql.org/file/documen...ndowfuncs.html
...man sollte ab und zu: RTFM.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#13

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 19:33
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#14

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 20:07
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.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#15

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 22:00
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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#16

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 22. Jun 2021, 07:05
@generic

Genial. Die Performance mit dem Clustered Index ist sagenhaft.

Vielen vielen Dank. Genau das habe ich gesucht.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#17

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 22. Jun 2021, 07:46
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? ..?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#18

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 22. Jun 2021, 14:24
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.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#19

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 23. Jun 2021, 16:01
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)
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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