2017-05-30 3 views
0

Single am nächsten Wert zu erhalten habe ich diese Abfrage:Wie für jede Spalte Typen in DB2

SELECT * FROM TABLE1 WHERE KEY_COLUMN='NJCRF' AND TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') AND DATE_EFFECTIVE_COLUMN<='2016-09-17' 

ich etwa 12 Datensatz erhalten (Zeilen) als Ergebnis.

Wie erhalten Sie das Ergebnis, das DATE_EFFECTIVE_COLUMN für jede TYPE_COLUMN am nächsten ist? Wie erhalten Sie in diesem Fall drei Datensätze für jeden Typ, die dem effektiven Datum am nächsten sind?

UPDATE: Ich könnte TOP verwenden, wenn ich nur über einen einzigen Typ gehen müsste, aber ich habe drei in diesem Moment und für jeden von ihnen muss ich nächste Zeit Ergebnis erhalten.

Hoffe ich machte es klar, lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Mögliches Duplikat [Finden Sie am nächsten Tag in SQL Server] (https://stackoverflow.com/questions/14023145/find-closest-date-in-sql-server) –

+0

@JacobH aktualisierte Frage. – Foxy

+0

Am nächsten zu übergehen? – xQbert

Antwort

1

Wenn ich richtig verstehe, können Sie ROW_NUMBER() verwenden:

SELECT t.* 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY TYPE_COLUMN ORDER BY DATE_EFFECTIVE_COLUMN DESC) as seqnum 
     FROM TABLE1 t 
     WHERE KEY_COLUMN = 'NJCRF' AND 
      TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') AND 
      DATE_EFFECTIVE_COLUMN <= '2016-09-17' 
    ) t 
WHERE seqnum = 1; 

Wenn Sie drei Datensätze wollen pro Typ, nur seqnum <= 3 verwenden.

1

Ich mag ROW_NUMBER() dafür. Sie wollen von TYPE partitionieren, die die Zeile für jeden Typen zählen über beginnen werden, dann um durch DATE_EFFECTIVE desc, und nur das höchste Datum nehmen (die erste Zeile):

SELECT * 
FROM (
    SELECT *, 
     ROW_NUMBER() over (PARTITION BY TYPE_COLUMN ORDER BY DATE_EFFECTIVE_COLUMN desc) RN 
    FROM TABLE1 
    WHERE KEY_COLUMN = 'NJCRF' 
    AND TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') 
    AND DATE_EFFECTIVE_COLUMN <= '2016-09-17' 
    ) A 
WHERE RN = 1