Как вернуть данные между двумя датами с помощью Stored Procuedure из нескольких входов данных

0

В настоящее время у нас есть таблица с новой записью, созданной каждый раз, когда поле прослушивается (представляя статус RAG). В настоящее время, если используется, как только сохраненное значение будет отражать, например, Красный; если бы они затем снова нажали, это изменило бы визуальную ориентацию на зеленый, но новая запись будет записана в таблицу.

например

Field1                 Red                     Time/Date
Field1                 Green                 Time/Date

Нам нужно подумать о том, как лучше всего сообщать, распознавая несколько строк, которые могут быть доступны для одного и того же поля (без ограничений на сколько раз люди могли бы прокручивать), на что "активное" значение. В настоящее время это видно только путем идентификации самой новой записи (по времени/дате), но если она будет работать в течение нескольких дней, это сделает отчет довольно сложным, учитывая, сколько записей может существовать в течение каждого дня....

Мы создали инструкцию (ниже), однако хотим, чтобы данные отображались в одном столбце, а не в одной строке:

 select(select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 22 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 23 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 24 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 25 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 26 and Board_Metrics_ID = 1 order by Date_Created desc limit 1);

Нам также нужно, чтобы это была хранимая процедура между двумя датами, поэтому мы можем легко изменить даты (например, 23/3/2018 - 29/3/2018).

Спасибо

Теги:
database
stored-procedures

1 ответ

0
Лучший ответ

Кажется, вам нужна последняя запись в день для данной метрики. Вы можете сделать это, используя коррелированный подзапрос:

select bmd.*
from SOMT_Development.Board_Metrics_Data bmd
where bmd.Metric_Year = 2018 and Metric_Month = 3 and
      bmd.Metric_Day in (26, 27, 28) and bmd.Board_Metrics_ID = 1 and
      bmd.Date_Created = (select max(bmd2.Date_Created)
                          from SOMT_Development.Board_Metrics_Data bmd2
                          where bmd2.Board_Metrics_ID = bmd.Board_Metrics_ID and
                                bmd2.Metric_Year = bmd.Metric_Year and
                                bmd2.Metric_Month = bmd.Metric_Month and
                                bmd2.Metric_Day = bmd.Metric_Day
                         );

Этот подзапрос может использовать индекс в Board_Metrics_Data(Metric_Year, Metric_Month, Metric_Day, Metrics_ID, Date_Created).

РЕДАКТИРОВАТЬ:

Для произвольного диапазона дат:

select bmd.*
from SOMT_Development.Board_Metrics_Data bmd
where bmd.Date_Created >= @start_date and bmd.Date_Created < @end_date and
      bmd.Board_Metrics_ID = 1 and
      bmd.Date_Created = (select max(bmd2.Date_Created)
                          from SOMT_Development.Board_Metrics_Data bmd2
                          where bmd2.Board_Metrics_ID = bmd.Board_Metrics_ID and
                                date(bmd2.Date_Created) = date(bmd.Date_Created)
                         );

Эта версия запроса немного сложнее оптимизировать.

  • 0
    Спасибо Гордон, это в значительной степени то, что мы ищем! Тем не менее, мы должны иметь возможность поместить это в хранимую процедуру с 3 входами (startDate, endDate и BMID), хотя startDate и endDate могут иметь разные месяцы и годы, как мы можем это сделать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню