PDA

View Full Version : Create Index mit Limit 1



Frankk
04-01-21, 07:36
Hallo,

ich würde gerne einen Index über eine physische Datei generieren, in der ich mir nur den jeweils aktuellsten Datensatz einer Schlüsselfolge habe wollte.

Beispielsweise:

FIRMA
KUNDE
ARTIKEL
DATUM - absteigend

Da es sich um eine Umsatzdatei handelt, wollte ich nur den aktuellsten Datensatz in der logischen Sicht sehen (Limit=1).

Kann man Limit beim erstellen von create index angeben? M.E. nicht!

dschroeder
04-01-21, 11:26
************ GELÖSCHT ****************

dschroeder
04-01-21, 11:30
Ich muss den Code nochmal schreiben. Ich habe in meiner ersten Antwort mit spitzen Klammern gearbeitet. Dabei hat der Editor einiges verschluckt.

Hallo,

kannst du nicht einfach mit SQL den passenden Satz abgreifen? Den Index würde ich dann nach "firma, kunde, artikel, datum desc" aufbauen.

select * from umsatz <datei>where firma=x and kunde=y and artikel=z order by datum desc fetch first row only;

oder, falls du alle aktuellsten verarbeiten willst:

with daten as (
select firma, kunde, artikel, max(datum) as maxDate from umsatz<datei><datei>
group by firma, kunde, artikel)
select <datei>.* from daten
join umsatz <datei>on daten.firma=umsatz<datei>.firma and daten.kunde=<datei>umsatz.kunde and daten.artikel=<datei>umsatz.artikel and daten.maxDate = <datei>umsatz.datum;

So müsstest du alle aktuellsten Sätze aus deiner <datei>bekommen. Ich gehe mal davon aus, dass ein Artikel nur einmal pro datum vorkommt.

Das Statement kannst du dir auch als View ablegen.

Dieter</datei></datei></datei></datei></datei></datei></datei></datei></datei></datei>

Frankk
04-01-21, 12:29
Hallo Dieter,

danke für Deine Antwort. Sorry, war missverständlich geschrieben von mir.

Mein Problem ist (leider) ein anderes:

ich habe pro Kunde / Artikel mehrere Datensätze mit unterschiedlichem Datum.

Hier ein Beispiel

Kunde |Artikel |Datum
001 | 400 | 01.12.2020
001 | 400 | 15.12.2020
002 | 300 | 03.12.2020
002 | 300 | 19.12.2020

Was ich in einer view benötige ist:

Wann wurde der Artikel eines Kunden zuletzt bestellt.

In diesem Beispiel sollte das Ergebnis 2 Zeilen liefern:

Kunde |Artikel |Datum
001 | 400 | 15.12.2020
002 | 300 | 19.12.2020

Somit ist klar, dass der Kunde 001 den Artikel 400 am 15.12.2020 zuletzt bestellt hat.

Das Ganze wollte ich gerne in so ablegen, damit ein Fremdsystem sich einfach dieser Daten bedienen kann. Eben wie eine Index bzw. logische Datei.

dschroeder
04-01-21, 12:52
Hallo Frank,
meine obige Common Table Expression löst genau dein Problem, denke ich. Du kannst das ganze Statement ("with daten ...") als View ablegen. Da kann dann jeder drauf zugreifen.

dschroeder
04-01-21, 12:54
Ich habe das Statement etwas komplex geschrieben, weil ich dachte, dass du alle Spalten aus deiner Umsatztabelle haben möchtest. Wenn es nur um die Schlüssel geht, ist es viel einfacher:

select firma, kunde, artikel, max(datum) as datum from umsatz<datei style="color: rgb(51, 51, 51); background-color: rgb(250, 250, 250);"><datei>
group by firma, kunde, artikel;

</datei></datei>Das müsste genau dein gewünschtes Ergebnis liefern.

Mit create view ... kannst du das dann ablegen und jeder kann darauf zugreifen.

Frankk
04-01-21, 13:22
Hallo Dieter,

herzlichen Dank für deine Unterstützung. Das ist genau das, nachdem ich gesucht habe. Mir war der Syntax und View bzw. Index nicht ganz klar.

Ich habe vergeblich im SQL Handbuch gesucht... (auch noch an der falschen Stelle) :-(

Grüße Frank