sql group按上次状态更改

时间:2012-10-04 20:06:18

标签: mysql reporting

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

表格是这样的:

+----+--------+----------+---------------------+
| 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

Pd积。

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

4 个答案:

答案 0 :(得分:0)

假设您的表名为'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);

答案 1 :(得分:0)

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) 

请确保数字和时间戳字段包含为保证查询效果而创建的相应索引。

答案 2 :(得分:0)

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

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

<强>解释

用数字键加入你的桌子。第二次,表只采用值不同于'buffered'的行。如果在“第二个”表中找到一行,则表示它们的值不同于使用此数字的“缓冲”值。

答案 3 :(得分:0)

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

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