1

我在名为 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

记录按日期降序排列。我只想获取状态等于 1 的记录,但只获取状态不再为 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。

4

3 回答 3

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 的最早行之后)。

不知道这有多有效。

于 2013-06-14T05:56:05.263 回答
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
   )
;

在 SQL Fiddle 上查看现场演示

LIMIT由于条款,这应该非常有效。如果表中有很多行,理论上它不会全部扫描它们——但是很大的免责声明:我根本不使用sqlite

于 2013-06-14T06:20:07.697 回答
-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
于 2013-06-14T06:02:21.093 回答