![]() |
AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
Zitat:
|
AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern
:oops:
z.B. FB. ![]() ...man sollte ab und zu: RTFM. :stupid: |
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. |
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. |
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:
Wenn du kannst mach einen ClusterIndex auf [MaterialNr], [BDatum] desc, [BFolge] desc
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 |
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. |
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? ..? |
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. |
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 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz