2017-04-25 44 views
-1

我有一个非常窄的表格:DATA,ID,LAT,LNG,TIME。 (https://gyazo.com/52b268c00963ed12ba85c6765f40bf63SQL只选择一个符合条件的项目

我想为每个不同的ID选择最新的数据。我使用的查询像

SELECT * 
    FROM name_of_table 
WHERE TIME > my_given_time; 

但它选择为每个不同的ID满足条件TOTALLY所有提交的数据,而不仅仅是数据。

有人能帮我写下查询吗?

谢谢你的帮助。 :)

编辑

我的工作查询的最终外观看起来像:

SELECT * FROM (SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TIME DESC) AS ROWNUMBER, * FROM my_table) WHERE ROWNUMBER = 1) WHERE TIME > my_time; 

谢谢大家的帮助

+1

您正在使用哪种RDBMS? – Strawberry

+0

@Strawberry我在Bluemix上使用DashDB – WutchZone

回答

1

一个唯一的标识符怎么样像这样

SELECT ID, DATA 
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TIME DESC) AS ROWNUMBER, ID, DATA 
FROM name_of_table) 
WHERE ROWNUMBER = 1; 

对于这些伪记录

INSERT INTO name_of_table (ID, TIME, DATA) VALUES('test',1230,16); 
INSERT INTO name_of_table (ID, TIME, DATA) VALUES('test2',1235,10); 
INSERT INTO name_of_table (ID, TIME, DATA) VALUES('test',1234,20); 

该查询返回每个ID的最大时间戳的数据值

ID DATA 
    ----- ---- 
    test 20 
    test2 10 
+0

它几乎可以正常工作!我只是小小的修改你的查询(即编辑)。谢谢<3 – WutchZone

+0

很高兴帮助您找到适合您的解决方案!请注意,实际上不需要最外层的SELECT按时间过滤。考虑将条件“WHERE ROWNUMBER = 1”更改为“WHERE ROWNUMBER = 1 AND TIME> my_given_time”,而不是简单化。 – ptitzler

0

试试这个:

SELECT a.* 
FROM `sometable` a 
JOIN (SELECT MAX(TIME) AS `max_time`,`ID` FROM `sometable` group by `ID`) b 
ON b.`ID` = a.`ID` AND a.`TIME` = b.`max_time`; 
+0

哦,只需编辑它即可。我会做... – Strawberry

+0

@SloanThrasher我不知道我是否写错了。因此,我应该用我自己的“变量”来取代一切? – WutchZone

+0

不是变量,而是后面抽动的列和表名, –

0

我会做这样的事情:

SELECT tt.* FROM tblTest tt 
WHERE _ID IN (
    SELECT TOP 1 _ID FROM tblTest WHERE ID = tt.ID ORDER BY TIME DESC 
) 

假设_ID,我在你的链接图片发现是每个单排

+0

我复制了它,并且被数据库抛出了一个错误:**在处理“_”附近的条件编译指令时发生错误。原因代码=“7”。 SQLSTATE = 428HV ** – WutchZone

相关问题