sql - 在SQL中,如何基于表中某个相对位置的其他行中的值查询行

标签 sql sqlite nested-query

我有一个数据库,其中包含具有“时间”(整数)和一些其他属性的事件。

例如。

CREATE TABLE events (time, attr1, attr2);
INSERT INTO events VALUES (1, 'a', 'foo');
INSERT INTO events VALUES (2, 'b', 'bar');
INSERT INTO events VALUES (4, 'a', 'baz');
INSERT INTO events VALUES (9, 'b', 'quux');
INSERT INTO events VALUES (10, 'c', 'foobar');


现在,我想做一个稍微复杂的查询:我想找到所有具有表中下一个事件满足某些条件的属性的事件。例如,我可能想查找满足所有这些条件的所有事件:


attr1 =='a'
下一个事件(由时间字段确定)具有attr2 =='bar'


这应该返回时间1处的事件,而不是时间4处的事件。或更复杂的示例将是:查找满足以下条件的所有事件:


attr1 =='a'
attr1 =='c'的下一个事件具有attr2 =='foobar'的下一个事件


这将返回时间1和4的两个事件。

似乎应该可以通过某种复杂的嵌套选择来实现,但是我还没有设法解决。

其他说明:


我正在使用sqlite。
事件间隔不规则,因此涉及计算“下一个”事件位置的策略将不起作用。
我知道这些查询在查询优化器上将是致命的,没关系。
我知道如何通过执行多次选择+非SQL逻辑来做到这一点,但是我宁愿使用纯SQL来做到这一点,因为它嵌入在更大的查询生成系统中。我通常需要能够生成这种形式的查询,并结合其他约束等,这不仅是我要编写一次并完成的单个查询。

最佳答案

通过组合ORDER BYLIMIT,可以找到特定时间后的下一条记录:

SELECT *
FROM events
WHERE time > 1
ORDER BY time
LIMIT 1


通过在子查询中使用它,您可以从下一条记录中查找值。

您的第一个查询可以这样实现:

SELECT *
FROM events AS e2
WHERE attr1 = 'a'
  AND (SELECT attr2
       FROM events
       WHERE time > e2.time
       ORDER BY time
       LIMIT 1) = 'bar'


您的第二个查询可以这样实现(附加条件属于子查询的WHERE):

SELECT *
FROM events AS e2
WHERE attr1 = 'a'
  AND (SELECT attr2
       FROM events
       WHERE attr1 = 'c'
         AND time > e2.time
       ORDER BY time
       LIMIT 1) = 'foobar'


使用time列上的索引可以使子查询查找更快。

关于sql - 在SQL中,如何基于表中某个相对位置的其他行中的值查询行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094257/

相关文章:

java - 如何在 sqlite 数据库表中使用 JAVA 代码插入值?

Android: android.database.sqlite.SQLiteException: no such column: _id: 编译时:SELECT _id, category, summary, description, status FROM todo

elasticsearch - Elasticsearch嵌套查询匹配和/或

mysql - 如何在 SQL 中有条件地定义 JOIN 的 ON 值?

sql - 根据两个值(Time、ID)向前填充

sql - 更新 DBT 中的表

php - 没有显示 mysql select all 的结果

java - 将值保存到数据库

php - 如何在 Laravel 5 的嵌套查询中使用 GroupBy?

php - SELECT、SELECT COUNT 和交叉引用表是否可以仅由一个查询处理?