【问题标题】:sql group by last status change按上次状态更改的 sql 组
【发布时间】:2012-10-04 20:06:18
【问题描述】:

我有一个存储日志信息的表(主要是状态变化)

表格是这样的:

+----+--------+----------+---------------------+
| id | number |  status  |      timestamp      |
+----+--------+----------+---------------------+
|  1 |     25 | buffered | 2012-05-05 23:10:10 |
|  2 |     25 | sent     | 2012-05-05 23:10:11 |
|  3 |     26 | not sent | 2012-05-05 23:10:12 |
|  4 |     27 | buffered | 2012-05-05 23:10:13 |
+----+--------+----------+---------------------+

我需要按状态生成报告。但是号码的状态可以改变。

号码的状态可以以buffered 开头,然后更改为sentnot sent

或者可以以sentnot sent开头,在这种情况下,状态不会再改变了

我认为在这些条件下,我可以毫无问题地按sentnot sent 进行分组(正确吗?)

但是我怎样才能只为buffered 行生成报告呢?

在这个特定示例中,如果有人问我:缓冲了哪些数字,正确答案是:number 27

P.D.

我认为标题不能准确反映问题,如果有人有更好的标题,请随时更改。

【问题讨论】:

  • where 子句:where status = 'buffered' 怎么样?您是在谈论没有已发送或未发送行的缓冲行吗?
  • 没错,我需要只有状态缓冲的数字,在这种情况下,数字 25 不应显示为缓冲,因为它后来被发送了。
  • 好的,我已经根据您的要求发布了我的答案。再见。
  • 这些答案中的任何一个对您有帮助吗?请记得选择正确的。

标签: mysql reporting


【解决方案1】:

这里是查询(没有子查询以获得更好的性能):

select distinct
    l1.id,  l1.number, l1.status, l1.timestamp 
from 
    my_logs l1 
 left outer joing
    my_logs l2
        on l1.number = l2.number and l2.status <> 'buffered'
where 
    l1.status = 'buffered' and
    l2.number is null

说明:

通过数字键加入您的表。第二次,表只取值不同于“缓冲”的行。如果在 'second' 表中找到一行,则表示它们的值与使用此数字的 'buffered' 不同。

【讨论】:

    【解决方案2】:

    假设您的表名是“log_table”,这应该会为您提供给定数字的最新状态:

     SELECT number, status FROM log_table  AS l WHERE timestamp = (SELECT MAX(timestamp) 
                  FROM log_table WHERE number = l.number);
    

    我对 MYSQL 的一大愿望是它允许(但目前不支持):

    SELECT number, status FROM log_table GROUP BY number HAVING MAX(timestamp);
    

    【讨论】:

      【解决方案3】:
      SELECT number, status FROM YOUR_TABLE t1 WHERE status  = :someStatus and NOT EXISTS (SELECT id FROM YOUR_TABLE t2 WHERE t1.id<>t2.id and t1.number = t2.number and t2.timestamp>t1.timestamp) 
      

      请确保数字和时间戳字段包含为保证查询性能而创建的适当索引。

      【讨论】:

        【解决方案4】:

        按出现的顺序对所有状态进行分组,并仅选择以状态缓冲开始和结束的状态(只有状态:缓冲)

        Select number, group_concat(status) allstatus 
        from tablename
         group by number
         having allstatus regexp '^buffered$'
         order by timestamp
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-22
          • 2016-07-11
          • 1970-01-01
          相关资源
          最近更新 更多