SQL来解决这个问题

时间:2013-06-14 05:12:14

标签: sql sqlite

我在表格中有以下数据,我将其称为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。

3 个答案:

答案 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
   )
;

See a Live Demo at SQL Fiddle

由于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