我在表格中有以下数据,我将其称为TableA:
ID Status Date
5 0 1000
20 0 900
10 1 800
30 1 700
4 1 600
8 0 500
22 1 400
1 1 300
3 0 200
记录按日期降序排序。我想只获取Status等于1的那些记录但仅限于Status不再为1的第一个记录。因此在样本数据中,将选择ID为:10,30,4的记录,但是22和1不会是因为ID 8出现并分隔集合。 SQL应该首先在Sqlite中运行。此示例数据的结果应返回:
ID Status Date
10 1 800
30 1 700
4 1 600
修改 我用随机值替换了ID值,并将日期从TEXT更改为Integer。
答案 0 :(得分:2)
我建议
select * from tableA a1 where a1.status = 1 and not exists
(select 1 from tableA a2 where a2.status = 0 and a2.date > a1.date and a2.date <
(select max(date) from tableA a3 where a3.status = 1
)
)
双嵌套子查询。选择状态为1且前面没有行的行(状态为0且位于状态为1的最早行之后)。
不知道这有多高效。
答案 1 :(得分:0)
你走了:
SELECT *
FROM
TableA A
INNER JOIN (
SELECT *
FROM TableA S
WHERE S.Status = 1
ORDER BY S.Date DESC
LIMIT 1
) S ON A.Date <= S.Date
WHERE
A.Status = 1
AND A.Date > (
SELECT E.Date
FROM TableA E
WHERE
E.Status = 0
AND S.Date > E.Date
ORDER BY Date DESC
LIMIT 1
)
;
由于LIMIT
子句,这应该非常有效。如果表中有很多行,理论上它们不会全部扫描它们 - 但是大的免责声明:我根本不使用sqlite 。
答案 2 :(得分:-1)
这未经过测试,但会给出一个想法。
它适用于MSSQL并使用子查询;我不知道它是否适用于sqlite。
select RowNumber() r, *
from (select * from TableA where status = 1), (select top 1 id from TableA where status = 1) diff
where id - r = diff - 1