Запросите базу данных MySQL и диапазон дат по группам, чтобы создать диаграмму - PullRequest
2 голосов
/ 07 февраля 2012

Я хочу создать следующую диаграмму из базы данных MySQL. Я знаю, как на самом деле создать диаграмму (используя Excel или аналогичную программу), моя проблема заключается в том, как получить данные, необходимые для создания диаграммы. В этом примере я вижу, что 1 января 60 билетов были в состоянии, показанном зеленой линией.

enter image description here

Мне нужно отслеживать историческое состояние заявок на проект по диапазону дат. Диапазон дат определяется руководителем проекта (в данном случае это 1 января - 9 января).

Для каждого билета у меня есть следующий набор исторических данных. Каждый раз, когда что-то изменяется в заявке (состояние, описание, правопреемник, обновление клиента и другие атрибуты, не показанные в этой проблеме), в базу данных вводится запись «отметка времени».

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 ]

3 голосов
/ 08 февраля 2012

Я не совсем уверен, что знаю, что вы хотите. Но . , .

Предполагая определение таблицы, например:

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 на этот счет. Если вы хотите получить только те, которые есть на 2 января, добавьте where date(status_changed_date) = '2011-01-02'

Или, если вы ищете различное количество билетов в день, измените count(*) на count(distinct ticket_num)

Это то, что вы спрашиваете? SQL Fiddle здесь

1 голос
/ 08 февраля 2012

Все сводится к общему вопросу: как получить список предметов и их последние статусы.Так.Учитывая одну проблему, мы можем получить ее самый последний статус с запросом:

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

Далее нам нужно получить все применимые отдельные идентификаторы проблем, которые представляют собой простой отдельный выбор:

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 будет установлено значение null.

Вероятно, это не лучший способ сделать это, но это первое, что пришло в голову.Я оставлю тебе другие вещи.Также я должен отметить, что это не очень эффективное решение.

1 голос
/ 08 февраля 2012

Вы можете использовать подзапрос, чтобы выбрать дату последней модификации перед заданной точкой, сгруппированную по 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
)
1 голос
/ 08 февраля 2012

Хорошо, поэтому, если вы пытаетесь получить количество записей в определенном состоянии в определенное время, я думаю, что хранимый процесс может быть необходим.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...