SQL只选择一项符合条件的项目

Posted

技术标签:

【中文标题】SQL只选择一项符合条件的项目【英文标题】:SQL select only one item which meets condition 【发布时间】:2017-04-25 15:54:48 【问题描述】:

我有一个非常窄的表: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;

感谢大家的帮助

【问题讨论】:

您使用的是哪个 RDBMS? @Strawberry 我在 Bluemix 上使用 DashDB 【参考方案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

【讨论】:

它几乎如我所愿!我只是稍微修改了您的查询(即编辑)。谢谢 很高兴它帮助您找到适合您的解决方案!请注意,您的最外层 SELECT 确实不需要按时间过滤。考虑将条件“WHERE ROWNUMBER = 1”更改为“WHERE ROWNUMBER = 1 AND TIME > my_given_time”以保持简单。【参考方案2】:

我会这样做:

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

假设我在您的链接图片中找到的 _ID 是每一行的唯一标识符

【讨论】:

我复制了它,DB 抛出了一个错误:处理“_”附近的条件编译指令时出错。原因代码="7"。 SQLSTATE=428HV【参考方案3】:

试试这个:

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 我不知道我是不是写错了。所以我应该用我自己的“变量”替换''中的所有内容? 不是变量,而是后面抽动的列名和表名,

以上是关于SQL只选择一项符合条件的项目的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionViewController 中只选择一项

如何在 Oracle SQL 中选择相关的一组项目

SQL 选择三级树中符合条件的所有节点

Flutter Using ListView.Builder:如何在我选择的所有项目上仅更改一项的背景颜色

报告索引未正确过滤访问 2010

根据 Oracle 的 SQL 中的优先级返回每个键的行