SQL语句从 'next'行中选择信息,最后一条记录丢失

标签 sql mysql row

我在使用 select 语句从“下一行”检索信息时遇到问题。我在 MySQL 中有一个表,其中包含状态信息(打开或关闭),示例记录如下:

状态表:(id自增)

+-----+----------+----------+---------------------+
| id  | asset_id | state_id | created             |
+-----+----------+----------+---------------------+
| 917 |       97 |        1 | 2013-10-13 22:07:03 |
| 918 |       97 |        0 | 2013-10-13 22:09:34 |
| 919 |       97 |        1 | 2013-10-13 22:09:52 |
| 924 |       97 |        0 | 2013-10-14 10:39:24 |
| 939 |       97 |        1 | 2013-10-14 12:47:26 |
| 940 |       97 |        0 | 2013-10-14 12:47:27 |
+-----+----------+----------+---------------------+

我需要做的是提出一个声明,为我提供给定日期内每个 Assets 的状态转换开始和结束时间,如下所示: 结束时间始终是下一个状态的开始时间。如果一天中的最后一个状态一直持续到第二天,我会将其报告为结束时间:

+----------+---------------------+---------------------+
| state_id | starttime           | endtime             |
+----------+---------------------+---------------------+
|        1 | 2013-10-13 22:07:03 | 2013-10-13 22:09:34 |
|        0 | 2013-10-13 22:09:34 | 2013-10-13 22:09:52 |
|        1 | 2013-10-13 22:09:52 | 2013-10-14 10:39:24 |
+----------+---------------------+---------------------+

这是我目前的声明:

SELECT t1.state_id, t1.created as starttime, t2.created as endtime 
FROM state t1, state t2 
WHERE t1.created like "2013-10-13%" and t1.asset_id=97 and t2.created = 
(SELECT min(created) FROM state 
    WHERE id > t1.id and asset_id = 97 order by created desc);

当请求的日期不是结果集的最后一天(如“2013-10-13”的示例中)时,此方法可以正常工作。问题是最后一天和最后一个状态(最后一条记录)。 如果我运行 2013 年 10 月 14 日的示例数据,我只得到两个状态转换,而不是三个:

+----------+---------------------+---------------------+
| state_id | starttime           | endtime             |
+----------+---------------------+---------------------+
|        0 | 2013-10-14 10:39:24 | 2013-10-14 12:47:26 |
|        1 | 2013-10-14 12:47:26 | 2013-10-14 12:47:27 |
+----------+---------------------+---------------------+

最后一个被删除可能是因为子查询的 where 子句“id > t1.id”。 创建的记录“2013-10-14 12:47:27”是表中的最后一条记录,并且其后没有其他记录可从中获取结束时间。

我的问题是: 是否可以更改查询,以便它也选择最后一个转换,例如使用 NULL 作为结束时间,如下所示:

+----------+---------------------+---------------------+
| state_id | starttime           | endtime             |
+----------+---------------------+---------------------+
|        0 | 2013-10-14 10:39:24 | 2013-10-14 12:47:26 |
|        1 | 2013-10-14 12:47:26 | 2013-10-14 12:47:27 |
|        0 | 2013-10-14 12:47:27 | NULL                |
+----------+---------------------+---------------------+

最佳答案

您需要左连接。尝试这个。您可以在这里看到它:http://sqlfiddle.com/#!2/c9cb7/2

SELECT t1.state_id, t1.created as starttime, t2.created as endtime 
FROM state t1
LEFT JOIN state t2 
  ON t1.asset_id = t2.asset_id
   AND t1.created < t2.created
WHERE t1.created like "2013-10-13%" and t1.asset_id=97 
  AND NOT EXISTS
    (SELECT *
     FROM state
     WHERE state.created > t1.created
      AND state.created < t2.created)
ORDER BY starttime

关于SQL语句从 'next'行中选择信息,最后一条记录丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450634/

相关文章:

jquery - 通过 jQuery 添加 </tr><tr>

sql - 从 SQL Server 表中获取连续数字范围

sql - Access SQL 返回今天的日期,该日期是好的,但如果今天的日期包含不好的时间,则不会返回今天的日期

PHP MYSQL preg_replace 或 REGEXP

c# - MySql 中的高级过滤结果

ios - 如何传递数据并在保存旧行的情况下向 TableView 添加一行

java - 如何在 Java 中向 Row[] 添加手动值

sql - Postgres/pgadmin3 - 为给定行选择所有等于 true 的列

sql - 动态查询立即执行?

mysql - 如何为PCF mySQL数据库设置mysql开发人员来管理它