查询MySQL数据库和按日期分组范围以创建图表

时间:2012-02-07 19:35:07

标签: mysql sql

我想从MySQL数据库创建以下图表。我知道如何实际创建图表(使用excel或类似程序),我的问题是如何获取创建图表所需的数据。在这个例子中,我可以看到,在1月1日,60张门票处于绿线所示的状态。

enter image description here

我需要通过日期范围跟踪项目的门票的历史状态。日期范围由项目经理确定(在本例中为1月1日至1月9日)。

对于每张票,我都有以下一套历史数据。每次故障单中的某些更改(状态,描述,受理人,客户更新以及此问题中未显示的其他属性)时,都会在数据库中生成“timestamp”条目。

ticket_num      status_changed_date     from_state  to_state
123456          2011-01-01 18:03:44     --          1
123456          2011-01-01 18:10:26     1           2
123456          2011-01-01 14:37:10     2           2
123456          2011-01-02 07:55:44     2           3
123456          2011-01-03 06:12:18     3           2
123456          2011-01-04 19:03:43     3           3
123456          2011-01-05 02:05:24     3           4
123456          2011-01-06 18:13:28     4           4
123456          2011-01-07 13:14:48     4           5
123456          2011-01-09 01:35:39     5           5

如何在给定时间内查询数据库(由我的脚本确定)并找出每张票据的状态?

例如:要生成上面显示的图表,给定日期2011-01-02 12:00:00,状态为“2”的票数是多少?

我尝试使用特定日期和范围查询数据库,但无法确定获取数据以创建图表的正确方法。提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

我不确定我知道你想要什么。但是。 。

假设表定义如下:

create table ticket_data (ticket_num int,
                          status_changed_date datetime,
                          from_state int,
                          to_state int);

例如,以下内容将为您提供每天的值数:

select date(status_changed_date) as status_date, count(*)
from ticket_data
group by status_date;

现在,如果你只需要from_state = 2,只需在其中添加一个where子句即可。如果您只想要1月2日的那些,那么请加入where date(status_changed_date) = '2011-01-02'

或者,如果您每天要查找不同数量的故障单,请将count(*)更改为count(distinct ticket_num)

这就是你问的问题吗? SQL小提琴here

答案 1 :(得分:1)

好的,如果你想在特定时间获得特定状态的记录数,我认为存储过程可能是必要的。

CREATE PROCEDURE spStatesAtDate
    @Date datetime,
    @StateId int
AS
BEGIN
   SET NOCOUNT ON;

   SELECT COUNT(*) as Count
   FROM ticket_table t1
   WHERE to_state = @StateId AND status_changed_date < @Date
        AND status_changed_date = (SELECT MAX(status_changed_date) FROM ticket_table t2 where t2.ticket_num=t1.ticket_num AND status_changed_date < @Date)
END

然后为上面的例子调用它,你的查询看起来像

EXEC spStatesAtDate @Date='2011-01-02 12:00:00', @StateId=2

答案 2 :(得分:1)

您可以使用子查询选择在按ticket_num分组的给定点之前的最后修改日期,然后在此时选择状态。

SELECT 
  ticket_num,
  to_state,
  status_changed_date
FROM
  tickets
WHERE 
status_changed_date IN (
  SELECT MAX(status_changed_date)
  FROM tickets
  WHERE status_changed_date < '2012-02-01 01:00:00'
  GROUP BY ticket_num
)

答案 3 :(得分:1)

这一切归结为常见问题:如何获取项目列表及其最新状态。所以。鉴于一个问题,我们可以通过查询获取其最新状态:

select to_state 
from ticket_states 
where ticket_num = t.ticket_num 
order by status_changed_date desc 
limit 1

接下来,我们需要获取所有适用的不同问题ID,这是一个简单的不同选择:

select distinct ticket_num from ticket_states

通过这两个子查询,我们已经可以开始构建了。例如,当前问题列表及其在指定日期之前的最新状态将为:

select t.ticket_num
     , (select to_state 
        from ticket_states 
        where ticket_num = t.ticket_num
        and status_changed_date <= '2012-01-01'
        order by status_changed_date desc 
        limit 1) as last_state
from (select distinct ticket_num 
        from ticket_states) t;

所有在指定时间不存在的问题都会将last_state设置为空。

这可能不是最好的方法,但首先想到的是这一点。我会留下其他东西给你。另外我应该提一下,这也不是一个非常有效的解决方案。