-
anzahl Sätze ermitteln
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
-
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:
Code:
With x as (Select K1
from YourTable
Order By K1, K2, K3
Limit 10000)
Select Min(K1), Max(K1)
from x;
-
Super, vielen Dank!
Limit .... den kannte ich nicht ....
-
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.
-
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
-
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.
-
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.
Similar Threads
-
By timeless in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 04-05-10, 12:33
-
By Jenne in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 26-09-08, 15:22
-
By Liebhoff in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 30-11-07, 12:16
-
By COS in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 22-11-07, 13:06
-
By f.g. in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 15-08-05, 13:25
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks