2017-10-25 1 views
0

ich eine SQL-TabelleSQL-Abfrage erhalten Neueinträge

id item date 
A apple 2017-09-17 
A banana 2017-08-10 
A orange 2017-10-01 
B banana 2015-06-17 
B apple 2014-06-18 

Wie habe ich eine SQL-Abfrage schreiben, so dass für jeden id ich die beiden letzten Elemente basierend auf Datum. ex:

id recent second_recent 
a orange apple 
b banana apple 
+0

Welche DBMS verwenden Sie? Die Antwort ist für verschiedene Systeme unterschiedlich. mysql <> SQL-Server. –

+1

auch - was hast du probiert? Dies ist kein Do it für mich Website – Randy

+0

Ich entfernte die inkompatiblen Datenbank-Tags. SQL Server und MySQL sind nicht dasselbe. –

Antwort

4

Sie können row_number() und bedingte Aggregation verwenden:

select id, 
     max(case when seqnum = 1 then item end) as most_recent, 
     max(case when seqnum = 2 then item end) as most_recent_but_one, 
from (select t.*, 
      row_number() over (partition by id order by date desc) as seqnum 
     from t 
    ) t 
group by id; 
0

Wie gesagt auf: SQL: Group by minimum value in one field while selecting distinct rows

Sie eine Gruppe von Ich denke min

SELECT mt.*,  
FROM MyTable mt INNER JOIN 
    (
     SELECT item AS recent, MIN(date) MinDate, ID 
     FROM MyTable 
     GROUP BY ID 
    ) t ON mt.ID = t.ID AND mt.date = t.MinDate 

zu bekommen verwenden, müssen Sie durch das gleiche mit einem tun können, zwei Wert zu erhalten statt

0

Sie können

Pivot-Tabelle
SELECT first_column AS <first_column_alias>, 
[pivot_value1], [pivot_value2], ... [pivot_value_n] 
FROM 
(<source_table>) AS <source_table_alias> 
PIVOT 
(
aggregate_function(<aggregate_column>) 
FOR <pivot_column> IN ([pivot_value1], [pivot_value2], ... [pivot_value_n]) 
) AS <pivot_table_alias>; 

Mehr hier mit Beispiel Erfahren Sie verwenden Example