PDA

View Full Version : anzahl Sätze ermitteln



ILEMax
15-09-22, 15:25
Moin zusammen,

eine Datei hat diesen key

K1 7S 0
K2 2S 0
K3 2S 0

1234567 00 00
2345678 00 00
2345678 01 00
2345678 02 00
3456789 00 00
3456790 00 00
3456790 01 00
....

Die Felder sind nicht durchgängig gefüllt

Wenn ich jetzt 10.000 Sätze haben will habe ich das versucht:

Select min(k1), max(k1), count(*) from Datei group by k1 having count(*) = 10.000

Das geht aber nicht
Wie ermittel ich den ersten k1 und letzen k1 der ersten 10.000 Sätze?


Danke
der ILEMax

B.Hauser
15-09-22, 18:41
So ganz habe ich nicht verstanden was Du brauchst.
Deshalb fasse ich zunächst einmal zusammen wie ich Deine Anforderung verstehe:
1. Du möchtest von einer Tabelle, die ersten 10.000 Sätze sortiert nach K1, K2, K3
2. Von diesen 10.000 Sätzen benötigst Du nur den kleinsten und größten K1 Schlüssel-Wert.

Wenn das die Anforderung ist, dann könntest Du die Daten wie folgt ermitteln:

With x as (Select K1
from YourTable
Order By K1, K2, K3
Limit 10000)
Select Min(K1), Max(K1)
from x;

ILEMax
16-09-22, 07:04
Super, vielen Dank!

Limit .... den kannte ich nicht ....

B.Hauser
16-09-22, 08:43
Limit (und Offset) gibt es seit 7.1 (TR)
Fetch First X Rows only, das die ersten x Zeilen zurückgibt, gibt es allerdings schon seit ca. V5R1M0.

Fuerchau
18-09-22, 17:14
Das Problem ist halt nur, dass Order By in Subqueries i.d.R. ignoriert werden.
Da gilt dann meist die Sortierung nach Satznummer.
M.a.W., der Limit funktioniert, der Order-By aber nicht.
Limit ist auch nur eine andere Schreibweise (näher am SQL-Standard) als "fetch first n rows only".

Dein SQL wird nämlich umgebaut in

Select Min(K1), Max(K1)
from (
Select K1 from YourTable
Limit 10000
)

With-Konstrukte erleichtern uns nur das Lesen von SQL's wowie die Wiederverwindung in mehreren Joins. Dies heißt ebenso, dass eine Mehrfachverwendung einer With-Table auch mehrfach gelesen wird.

Nachdem ich nun mal an eine V7-Mschine gekommen bin, konnte ich prüfen, dass im Gegensatz zu früher ein "Order By" nun doch angewendet wird.
Wann immer das nun mal dazugekommen ist.

Beim Lateral Table geht das schon länger, bei Subqueries nun wohl auch.
Aber dies ist eher nicht Standard-SQL, denn der Microsoft SQL-Server lehnt dies ab.

Die Alternative wäre ansonsten noch

Select Min(K1), Max(K1)
from (
Select K1, row_number() over(order by K1) as rowno
from YourTable
)
where rowno <= 10000

B.Hauser
19-09-22, 18:12
M.a.W., der Limit funktioniert, der Order-By aber nicht.
Natürlich funktionniert der LIMIT in Verbindung mit einem ORDER BY.
In diesem Fall wird nämlich zunächst das volle Query ausgeführt und dann die gewünschte Anzahl an Datensätzen zurückgegeben.

Fuerchau
20-09-22, 08:19
In der Vergangenheit habe ich viele Subqueries mit Order by probiert, die alle nicht funktionierten.
Dass dies nun ab V7Rx TRy klappt kann ich auch nicht immer probieren.
Gestern war ich mal wieder auf einer Kundenmaschine mit V7R3 wo das dann funktionierte.