Maximum kleiner als wert

Markus92

Aktiver Benutzer
Beiträge
30
Hallo,
Ich habe versucht, zu jeder id die passende vorherige id zu erhalten. Das funktioniert auch soweit nur fehlt der Datensatz
Code:
NULL,1
. Kann mir jemand helfen, wie ich den auch noch erhalte?
Code:
select max(a.id), b.id from test a right outer join test b on a.feld1=b.feld1 and a.feld2=b.feld2 where b.id=1 and a.id<b.id or isnull(a.id) group by b.id

Vielen Dank schonmal
 
Werbung:
Daten:
|id|feld1|feld2
|1|1|1
|2|1|1
|3|1|1
|4|1|1
|5|2|1
|6|1|2
|7|1|1
gewünschtes Ergebnis:
NULL|1
NULL|5
NULL|6
1|2
2|3
3|4
4|7
5|NULL
6|NULL
7|NULL

Das Ergebnis meines Selects:
1|2
2|3
3|4
4|7
 
Naja, ich habe eine Tabelle, mit test a right outer join test b mach ich nen self join. Für a.Feld1=b.Feld1 und a.Feld2=b.Feld2 möchte ich die ID von a selektieren und die um eins niedrigere aus b selektieren für die a.feld1=b.feld1 und a.feld2=b.feld2.
 
Naja, ich habe eine Tabelle, mit test a right outer join test b mach ich nen self join. Für a.Feld1=b.Feld1 und a.Feld2=b.Feld2 möchte ich die ID von a selektieren und die um eins niedrigere aus b selektieren für die a.feld1=b.feld1 und a.feld2=b.feld2.
Müsste dann nicht a.Feld1 = b.Feld1 - 1 und a.Feld2 = b.Feld2 - 1 gelten wenn es die um eins niedrigere ID sein soll?
Ich verstehe allerdings nicht warum du 2 Felder vergleichst und bei deinem "gewünschten Ergebnis" und dem tatsächlichen "Ergebnis" fehlen die Spaltenbeschriftungen, da weis man jetzt nicht was woher kommt. Das mit max() und GROUP BY würde ich erstmal weglassen, das hat ja eigentlich nichts mit dem Problem zu tun oder ich verstehe es nicht.
 
Müsste dann nicht a.Feld1 = b.Feld1 - 1 und a.Feld2 = b.Feld2 - 1 gelten wenn es die um eins niedrigere ID sein soll?
Nein, bei den Spalten handelt es sich um 2 fks, und die sollen übereinstimmen, wenn ich den nächste kleineren PK selektiere, für den die beiden fks übereinstimmen.

Ich verstehe allerdings nicht warum du 2 Felder vergleichst und bei deinem "gewünschten Ergebnis" und dem tatsächlichen "Ergebnis" fehlen die Spaltenbeschriftungen, da weis man jetzt nicht was woher kommt.
Daten:
|id|feld1|feld2
|1|1|1
|2|1|1
|3|1|1
|4|1|1
|5|2|1
|6|1|2
|7|1|1
gewünschtes Ergebnis:
max(a.id)|b.id
NULL|1
NULL|5
NULL|6
1|2
2|3
3|4
4|7
5|NULL
6|NULL
7|NULL

Das Ergebnis meines Selects:
max(a.id)|b.id
1|2
2|3
3|4
4|7

Das mit max() und GROUP BY würde ich erstmal weglassen, das hat ja eigentlich nichts mit dem Problem zu tun oder ich verstehe es nicht.
Damit versuche ich die nächstkleinere ID zu selektieren, für die a.feld1=b.feld1 und a.feld2=b.feld2
 
Werbung:
Also ich kann auch dein bisheriges Ergebnis nicht reproduzieren, jedenfalls nicht mit der Abfrage. Ich habs mal völlig anders angefangen:
Code:
-- Testdaten
WITH test AS (
SELECT 1 AS id,1 AS feld1, 1 AS feld2 UNION ALL
SELECT 2 AS id,1 AS feld1, 1 AS feld2 UNION ALL
SELECT 3 AS id,1 AS feld1, 1 AS feld2 UNION ALL
SELECT 4 AS id,1 AS feld1, 1 AS feld2 UNION ALL
SELECT 5 AS id,2 AS feld1, 1 AS feld2 UNION ALL
SELECT 6 AS id,1 AS feld1, 2 AS feld2 UNION ALL
SELECT 7 AS id,1 AS feld1, 1 AS feld2
)
-- Abfrage
SELECT    id AS a_id,
        (    SELECT    min(t.id)
            FROM    test t
            WHERE    t.feld1 = test.feld1
            AND        t.feld2 = test.feld2
            AND        t.id > test.id ) AS b_id
FROM    test
UNION ALL
SELECT    NULL AS a_id,
        id AS b_id
FROM    test
WHERE NOT EXISTS (    SELECT    1
                    FROM    test t
                    WHERE    t.feld1 = test.feld1
                    AND        t.feld2 = test.feld2
                    AND        t.id < test.id )
 
Zurück
Oben