2017-04-20 3 views
0

ich in SQL zweiten Eintrag erhalten möchten bekommenI Want zweite Eintrag Datum-Zeit weise

Consgno  Name  Entrydatetime 

111   A  01/03/2017 10:10:15 
111   A  01/03/2017 10:20:15 
111   A  01/03/2017 11:10:20 
222   B  02/03/2017 10:10:25 
222   B  02/03/2017 11:10:36 
333   C  06/03/2017 10:10:25 
333   C  07/03/2017 10:10:12 
444   D  04/03/2017 10:10:41 
444   D  04/03/2017 01:10:20 
444   D  06/03/2017 10:10:32 

One Consgno mehr als einmal eingetreten ist. Und ich möchte die Ausgabe wie folgt aus:

Consgno Name  Entrydatetime 
    111  A  01/03/2017 10:20:15 
    222  B  02/03/2017 11:10:36 
    333  C  07/03/2017 10:10:12 
    444  D  04/03/2017 01:10:20 
+0

http://stackoverflow.com/questions/tagged/greatest-n-per-group+sql –

+0

Markieren Sie die von Ihnen verwendeten dbms. Wenn es um Datum/Uhrzeit geht, sind viele Produkte weit entfernt von ANSI SQL. – jarlh

+0

Mögliches Duplikat von [SQL Server: SELECT nur die Zeilen mit MAX (DATUM)] (http://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) –

Antwort

1

SQL Server/Oracle/Postgres:

with CTE as 
(
select MyTable.*, row_number() over(partition by consgno order by entrydatetime) as rn 
from MyTable 
) 
select * 
from CTE 
where rn = 2 
-1

Verwenden OFFSET-Befehl in der Abfrage zB.

SELECT DISTINCT Consgno,Name,Entrydatetime FROM tbl_test ORDER BY 
    Consgno 
LIMIT 1 OFFSET 1; 

In diesem Beispiel wird die zweite Zeile ausgewählt. Das Consgno muss DISTINCT sein

+0

Sicherlich müssen Sie 'Entrydatetime' in die' Reihenfolge von' hinzufügen? – JohnHC

+0

könnte auch funktionieren. –

+0

Warum 'SELECT DISTINCT' wenn 'LIMIT 1'? (Btw, sind Sie sicher, dass OP ein dbms verwendet, das diese herstellerspezifische 'LIMIT' unterstützt?) – jarlh

-2

Sie können meine Abfrage beziehen. Ich hoffe, zu helfen, mein Freund :))

With CTE 
AS 
(
select *, ROW_NUMBER() over (partition by Consgno order by Consgno) as Number 
from Test) 

select * from CTE where Number = 2 
+0

Falsche 'Reihenfolge von' basierend auf erwarteten Ausgang – JohnHC

+0

@ JohnHC: Ich habe getestet und es gab die Ausgabe wie erwartet, mein Freund! – Tomato32

+0

Diesmal ja. Bei einem größeren Dataset kann dies nicht garantieren, dass das zweite Vorkommen (nach Datum) des OP mit der erwarteten Ausgabe – JohnHC

1

(Funktioniert nur, wenn Sie DB Fenster analytische Funktionen) unterstützt

Im Fall, wenn es Zufall ist, dass Entrydatetime für gleiche Consgno wiederholt werden, und Sie möchten zweite date-time wise verwenden Sie können dann:

select * from (
    select MyTable.*, 
    dense_rank() over(partition by consgno order by entrydatetime) as rnk, 
    row_number() over(partition by consgno,entrydatetime order by entrydatetime) as rn 
    from MyTable 
) t 
where rnk = 2 and rn = 1 

(Beachten Sie, dass, wenn consgno für jede Zeile gleiche Entrydatetime haben, diese Abfrage, dass consgno überhaupt nicht zurückgibt.)