2016-12-01 127 views
0

我有不同的STime和ETime的Id1和Id2。对于每组Id1和Id2,我倾向于获取第一个和最后一个记录(如输出中所示)。 我试图通过ASC和DESC顺序使用分区与ID1和ID2,并责令该表:获取表格中的第一个和最后一个记录

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 

如预期,我没有得到结果。

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

首先和最后一个每个Id或整个输出? –

+0

我正在尝试每个Id – user3447653

+0

以及“first”和“last”是什么?它是基于哪个字段? –

回答

1

查询在你原来的问题不完全匹配,你后面的评论,但仍低于应该帮助你,使你的目标

尝试

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 

理念这里在内部添加两个字段将编号从开始和结束的所有行的查询

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 

和tha n离开第一行和最后一行

WHERE first_record = 1 OR last_record = 1 
+0

对不起,当我根据Id1和Id2对其进行分区时,我没有得到期望的结果。 – user3447653

+0

但你原来的问题只是与Id1,而不是两个ID!你不是两个新问题吗?我正要回答它? –

+0

你能澄清一下,如果你只有一个ID就可以得到你原来的问题的输出结果吗? –

相关问题