2016-06-21 4 views
-2

Ich möchte 3 neueste Geräte für eine Person holen. Tabellenstruktur wird unterHolen Sie 3 letzte Details aus der Tabelle

PERSON_DEVICE 

person_id seq_num device_detail device_detail_added 
999   1   Nexus  03/04/2015 
999   2   iphone  06/07/2015 
999   3   laptop  08/09/2015 
999   4   uda   02/01/2016 
999   5   pda   04/04/2016 
1001  1   sm    03/03/2015 
... and so on 
gezeigt

Für neuestes Gerät für eine Person, die ich verwenden kann folgende Abfrage

select * from PERSON_DEVICE 
where person_id = 999 
    and seq_num = (select max(seq_num) from PERSON_DEVICE where person_id = 999) 

aber für die zweiten neueste und dritten neuesten, ich weiß nicht, wie diese zu bekommen?

Ich versuchte mit limit, aber in Sybase funktioniert es nicht (für meine Sybase-Version).

P.S. seq_num wird verwendet, um das neueste Gerät für eine bestimmte Personen-ID zu identifizieren.

******************** BEARBEITEN ************************* **************** 88

PERSON 
person_id name addres 
999   john 2 avenue 
1001  elliot rrt 

I want to records to 

select pn.name , pd.device1 ,pd.device_detail_added1, pd.device2 ,pd.device_detail_added2,pd.device3 ,pd.device_detail_added3 from PERSON pn , PERSON_DEVICE pd 
+0

Dies ist markiert Oracle und Sybase - für welche ist die Frage? Wenn es sich um Sybase handelt, dann bewegen Sie die Maus über das Sybase-Tag, lesen Sie den Text und bearbeiten Sie die Frage, um das richtige Tag für die von Ihnen verwendete Version auszuwählen. – MT0

+0

Wenn dies Sybase ist, dann Duplikat von [Gibt es eine Möglichkeit, TOP X Datensätze mit gruppierten Daten zu finden?] (Http://stackoverflow.com/q/2953724/1509264) und wenn dies Oracle ist, dann [Get Top Ergebnisse für jeden Gruppe] (http://StackOverflow.com/q/134958/1509264) (siehe die am höchsten gewählte Antwort nicht die akzeptierte Antwort). – MT0

Antwort

0

Wenn seq_num verwendet wird zuletzt verwendete Gerät zu holen, dann sollte die folgende Abfrage arbeiten:

SELECT TOP 3 * 
FROM PERSON_DEVICE 
WHERE person_id=999 
ORDER BY seq_num DESC 
0

Dies sollte Arbeit an allen person_id (Entfernen where person_id=999)

select * 
    from (
     select person_id , device_detail, device_detail_added, seq_num , 
       row_number() over (partition by person_id order by seq_num desc) as rango 
      from PERSON_DEVICE 
      where person_id=999) as t 
where rango <=3; 
0

in oracle db können Sie unten verwenden, um am drittletzten zu erhalten:

SELECT * FROM (SELECT PERSON_DEVICE.*, ROW_NUMBER() OVER(ORDER BY SEQ_NUM DESC) AS TARGET_NO FROM PERSON_DEVICE WHERE PERSON_ID = 999) WHERE TARGET_NO <= 3 
Verwandte Themen