我有一个数据库,其中包含具有“时间”(整数)和一些其他属性的事件。
例如。
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 BY
和LIMIT
,可以找到特定时间后的下一条记录:
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/