仅选择满足条件的一个项目的SQL查询

3

我有一张非常窄的表格:DATA, ID, LAT, LNG, TIME。 (https://gyazo.com/52b268c00963ed12ba85c6765f40bf63)

我想选择每个不同ID的最新数据。我曾经使用类似以下查询语句:

SELECT * 
  FROM name_of_table 
 WHERE TIME > my_given_time;

但是它选择了全部数据,而不仅仅是符合条件的每个不同 id 的数据。

有人能帮我写下这个查询吗?

感谢任何帮助。:)

编辑

我的最终工作查询如下:

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
你使用哪个关系型数据库管理系统? - Strawberry
@Strawberry 我在Bluemix上使用DashDB。 - WutchZone
3个回答

4
这个怎么样?
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

它几乎按照我想要的方式工作!我只是稍微修改了你的查询(即编辑)。谢谢 <3 - WutchZone
1
很高兴它帮助你找到了适合你的解决方案!请注意,你最外层的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`;

@SloanThrasher 我不知道我是否写错了。所以,所有在 ' ' 中的内容都应该替换为我的“变量”吗? - WutchZone
不是变量,而是在反引号中使用列名和表名。 - Sloan Thrasher

0
我会这样做:
SELECT tt.* FROM tblTest tt
WHERE _ID IN (
    SELECT TOP 1 _ID FROM tblTest WHERE ID = tt.ID ORDER BY TIME DESC
)

假设我在您提供的图片中找到的“_ID”是每个行的唯一标识符


我复制了它,但我的数据库出现了错误:在“_”附近处理条件编译指令时发生错误。原因代码="7"。SQLSTATE=428HV - WutchZone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接