2016-12-01 5 views
0

Ich habe Id1 und Id2 mit verschiedenen Zeit und ETime. Für jede Gruppe von Id1 und Id2 tendiere ich dazu, den ersten und letzten Datensatz zu erhalten (wie in der Ausgabe gezeigt). Ich habe versucht, Partitionieren der Tabelle mit Id1 und Id2 und um sie von asc und desc Reihenfolge mit:Erste und letzte Datensätze in einer Tabelle

ROW_NUMBER() OVER(PARTITION BY B.HardwareId, A.TripId ORDER BY StartTime) AS first_record, 
ROW_NUMBER() OVER(PARTITION BY B.HardwareId, A.TripId ORDER BY StopTime DESC) AS last_record 

Ich habe nicht die Ergebnisse erhalten, wie erwartet.

SELECT 
    A.Id1 AS Id1, 
    A.Id2 AS TriId2pId, 
    STime, 
    ETime, 
    Latitude, 
    Longitude 

FROM 
    Tr.T1 AS A 
JOIN 
    Tp.G2 AS B 
ON 
    A.STime < B.DateTime 
    AND A.ETime >= B.DateTime 
    AND A.Id1 = B.Id1 
WHERE 
    (A._PARTITIONTIME BETWEEN TIMESTAMP('2016-11-23') 
    AND TIMESTAMP('2016-11-23') 
    AND A.Id1 IN (976)) 
ORDER BY 
    B.Id1, 
    A.Id2, 
    B.DateTime 



    Id1 Id2 STime    ETime    Latitude Longitude 
    976 715 2016-11-23 13:06:26 2016-11-23 13:23:30 26.2230015 -80.12314  
    976 715 2016-11-23 13:06:26 2016-11-23 13:23:30 26.2229767 -80.12326  
    976 715 2016-11-23 13:06:26 2016-11-23 13:23:30 26.2226944 -80.12344 
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2251511 -80.11865  
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2251511 -80.11912  
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2250233 -80.11929  
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2245369 -80.11929   


    Id1 Id2 STime    ETime    Latitude Longitude 
    976 715 2016-11-23 13:06:26 2016-11-23 13:23:30 26.2230015 -80.12314 
    976 715 2016-11-23 13:06:26 2016-11-23 13:23:30 26.2226944 -80.12344 
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2251511 -80.11865 
    976 800 2016-11-23 13:06:26 2016-11-23 13:24:59 26.2245369 -80.11929 
+0

zuerst und zuletzt für jede Id oder für den ganzen Ausgang? –

+0

Ich versuche es für jeden Id – user3447653

+0

und was ist 'first' und' last'? Basiert es auf welchem ​​Feld genau? –

Antwort

1

Abfrage in Ihrer ursprünglichen Frage nicht genau Sie später Kommentare entsprechen, aber unten sollte noch helfen, Ihr Ziel

Versuchen

SELECT 
    A.Id AS Id, 
    StartTime, 
    StopTime, 
    Latitude, 
    Longitude 
FROM (
    SELECT 
    A.Id AS Id, 
    StartTime, 
    StopTime, 
    Latitude, 
    Longitude, 
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY StartTime) AS first_record, 
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY StartTime DESC) AS last_record 
    FROM 
    Tb1.Ids AS A 
    JOIN 
    Tb2.Points AS B 
    ON 
    A.StartTime <= B.DateTime 
    AND A.StopTime >= B.DateTime 
    AND A.HardwareId = B.HardwareId 
    WHERE 
    (A._PARTITIONTIME BETWEEN TIMESTAMP('2016-11-23') 
    AND TIMESTAMP('2016-11-23')) 
    AND A.Id IN (334) 
) 
WHERE first_record = 1 OR last_record = 1 

Idee hier zu machen, fügen Sie zwei Felder in Innen Abfrage, die alle Zeilen von Anfang und Ende nummerieren würde

ROW_NUMBER() OVER(PARTITION BY id ORDER BY StartTime) AS first_record, 
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY StartTime DESC) AS last_record 

und tha n um die erste bzw. letzte Zeile zu verlassen

WHERE first_record = 1 OR last_record = 1 
+0

Sorry, ich habe nicht das gewünschte Ergebnis erhalten, wenn ich es basierend auf Id1 und Id2 partitioniert habe. – user3447653

+0

aber deine ursprüngliche Frage war nur mit Id1 und nicht mit zwei Ids !! Ist das nicht deine neue Frage? Ich wollte es beantworten? –

+0

können Sie klären, ob Sie die gewünschte Ausgabe Ihrer ursprünglichen Frage mit nur einer ID erhalten? –

Verwandte Themen