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
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 14:42
Das Mittel der Wahl für diese SQL Abfrage wäre eine PARTITION BY Klausel. Die Partition wird aus der mat_nr gebildet und innerhalb der Partition wird dann nach den beiden anderen Spalten sortiert. Der letzte Datensatz der Partition erhält dann das "J" Kennzeichen, die vorigen das "N".

Zum Einstieg:

https://docs.microsoft.com/de-de/sql...l-server-ver15
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

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

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 15:23
Das mit OVER klingt interessant aber auch kompliziert.

Zitat:
Mir würde schon helfen, wie das SQL Select Statement aussehen muss, um bei den Daten nur den 3. Datensatz zu bekommen.
Um zu bekommen, benötige ich da auch OVER?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 16:13
Das mit OVER klingt interessant aber auch kompliziert.

Zitat:
Mir würde schon helfen, wie das SQL Select Statement aussehen muss, um bei den Daten nur den 3. Datensatz zu bekommen.
Um zu bekommen, benötige ich da auch OVER?
Ja, das OVER ist auf jeden Fall erforderlich, da es die Fensterfunktion definiert. Je nach Anwendungsfall ist das PARTITION BY oder das ORDER BY nicht erforderlich, das ergibt sich aus dem Syntaxdiagramm und in den Beispielen auf der verlinkten Seite - hier sieht man eins ohne PARTITION BY

Code:
SELECT BusinessEntityID, TerritoryID  
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)  
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)  
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5 
ORDER BY SalesYear;
Michael Justin

Geändert von mjustin (21. Jun 2021 um 16:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 16:38
Moin...
[OT]
Code:
SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5 
ORDER BY SalesYear;
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)
[/OT]

Geändert von haentschman (21. Jun 2021 um 16:41 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 16: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.436 Beiträge
 
Delphi 12 Athens
 
#6

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 17: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
 
#7

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 18: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
Antwort Antwort


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 09:34 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-2025 by Thomas Breitkreuz