Запит реєстрової вибірки для MySQL 5.x

Реестр/регистр предназначен для записи однотипных значений относящихся к различным контекстам в хронологическом порядке с целью иметь возможность получать для произвольного контекста последнее актуальное значение на произвольную точку шкалы времени.

Регистры чрезвычайно важны для создания современных информационных систем для хранения и представления данных в первичном ключе которых используется время.

Таблица регистра

Практически регистр является таблицей записей с составным ключом, который определяет контекст и содержит поле даты записи в составе ключа.

Для примера поля k1 и k2 определяют контекст, поле kts содержит время регистрации, v1 и v2 содержат полезные данные для хранения и выборки:

Очевидный алгоритм

Выборка значений актуальных на определенную дату называют временным срезом. Для получения среза  очевидным и несложным является выборка в два этапа:

  1. из записей заданного контекста выбрать наибольшее значение даты, что позволяет получить ключи для выборки последних записей
  2. выбрать записи по ключам последних записей

Запрос

 

Альтернативный алгоритм

Выборка значений актуальных на определенную дату часто называют временным срезом. Для получения среза необходимо выполнить алгоритм:

  1. выбрать записи контекста заданного k1 и k2
  2. упорядочить группы каждого контекста по времени kts
  3. маркировать последнюю запись в каждой группе
  4. выбрать маркированные записи

Нюанс реализации состоит в том, что п.3 маркирования последней записи легко решается алгоритмическими средствами, и громоздко решается средствами SQL.

Запрос

//

Поскольку в SQL 5.x нет средств выделения групп в выборке, в запросе применен искусственный прием. В первом каскаде выборки создаются переменные @k1 и @k2, которые на этом этапе получают пустые значения.

Во втором каскаде значения в переменных позволяют обнаружить начало новой группы по изменению ключевых полей, т.к. в первом каскаде поле даты kts сортируется по убыванию, то первая запись в группе является последней в хронологическом порядке. Эта запись в группе маркируется в поле trailer.

В третьем каскаде выбираются записи маркированные в поле trailer - это и есть записи среза.

Leave a Reply