2017-03-17 2 views
0

Ich habe Abfrageergebnis/Tabelle mit Spalten: ID, Datum. Wie:firebird 2.5 Datensätze auswählen mit Datum am nächsten zu heute

id, Datum
0001, 2012.01.20
0001, 2014.10.12
0001, null
0001, 2017.05.21
0001, 2017.08.15
0002, null
0002 , 2013.06.05
0002, 2017.08.11
0003, null
0004, 2011.12.25
0005, 2017.12.10
0006, null
0006, 2013.04.23
.
.
.
etc ...
Es ist ein Beispiel - in der realen Welt gibt es ein paar tausend IDs und mehr als anderthalb Millionen Datensätze. Wie man Datensätze findet, die dem heutigen zukünftigen Datum am nächsten sind (id 0001, 0002, 0005) und diese nur mit null (id 0003), vergangenen Daten (id 0004) oder null und vergangenen Daten (id 0006) durch Text ersetzen. Das Ergebnis sollte wie folgt aussehen:

id, Datum
0001, 2017.05.21
0002, 2017.08.11
0003 'ersetzt Text'
0004 'ersetzt Text'
0005, 2017.12.10
0006, 'Ersetzter Text'
.
.
etc ...
Ich hoffe, dieses Beispiel zeigt genau, was ich brauche.
Vielen Dank für Hinweise.

+1

SO kein ‚Code für Me'-Service. Was hast du probiert und wo steckst du fest? –

Antwort

1

Es scheint, dass die Tabelle keinen Primärschlüssel hat. Verwenden Sie keine Feldnamen als Typnamen, z. B. "DATUM".

Wie auch immer, hier ist ein Beispiel, wie Sie das tun wollen, keine Ansprüche, dass es das Beste ist.

Beachten Sie, dass diese Prozedur langsam ist, wenn viele Datensätze vorhanden sind, also stellen Sie sicher, dass die richtigen Indizes platziert sind.

SET TERM^; 

create or alter procedure TEMP_TEST_PROC (
    IDATE date) 
returns (
    OID varchar(4), 
    DATE_BEFORE date, 
    DATE_AFTER date, 
    CLOSEST_DATE date, 
    OTEXT varchar(32)) 
as 
begin 
    for select distinct id from test_table_wo_pk 
    into :oid 
    do 
    begin 
    date_before = null; 
    date_after = null; 
    /* get closest past date*/ 
    select first 1 t."DATE" from test_table_wo_pk t 
    where ((t."DATE" <= :idate) and (t.id = :oid)) 
    order by t."DATE" desc 
    into 
     :date_before; 

    /* get closest future date*/ 
    select first 1 t."DATE" from test_table_wo_pk t 
    where (t."DATE" >= :idate) and (t.id = :oid) 
    order by t."DATE" 
    into 
     :date_after; 

    /* bonus - get closest future or past date */ 

    ... You may check date_before, date_after for NULL here, and set closest_date value here.... 

    if ((datediff(day,:date_before,:idate)) < (datediff(day,:idate,date_after))) then 
     closest_date = :date_before; 
    else 
     closest_date = :date_after; 

    /* set text column */ 
    if (:date_after is not null) then 
     otext = :date_after; 
    else 
     otext = 'replased text'; 
    suspend; 
    end 
end^ 

SET TERM ;^

Das Ergebnis:

enter image description here

+0

Es funktioniert. Es ist sehr langsam, aber ich habe einen Ausgangspunkt, um weiterzugehen .... Danke Val. – jirzinek

Verwandte Themen