оптимизация строк данных на основе приоритетов - PullRequest
0 голосов
/ 21 декабря 2018

Таблица Измеренная точка :

  • id
  • имя

Таблица ребро :

  • id
  • имя

Таблица Meas_point_Data :

  • ID
  • Meas_point_id (внешний ключ)
  • дата
  • значение

Таблица edge_meas_point :

  • id
  • edge_id (внешний ключ)
  • measure_point_id (внешний ключ)
  • order (int)

Пример данных :

точка измерения (идентификатор, имя):

  • 1, измерение 1
  • 2, измерение 2
  • 3, измерение 3

edge (id, name):

  • 1, edge1

edge_meas_point (id, edge_id, measure_point_id, заказ):

  • 1, 1, 1, 3
  • 2, 1, 2, 1
  • 3, 1, 3, 2

measure_point_data (id, measure_point_id, дата, значение):

  • 1, 1, 2018-12-20, 11
  • 2, 2, 2018-12-20, 12
  • 3, 3, 2018-12-20, 13
  • 4, 1, 2018-12-21, 21
  • 5, 3, 2018-12-21, 23
  • 6, 1, 2018-12-22, 31
  • 7, 1, 2018-12-23,41
  • 8, 2, 2018-12-23, 42
  • 9, 3, 2018-12-23, 43

Идея

Таблица edge_meas_point объединяет ребро с measure_point с заданным приоритетом (заказ).Если нет данных из точки измерения в заказе 1, заказ 2 должен быть взят и так далее.Например:

SELECT TOP 1 d.date, d.value
    FROM meas_point_data AS d, edge_meas_point AS em
    WHERE
      em.meas_point_id=d.meas_point_id AND
      em.edge_id=1 AND
      d.date=2018-12-21
    ORDER BY em.order

отлично работает на одну дату в ГДЕ, но что, если я хочу нарисовать диаграмму из этих данных?На основании этого примера мой выбор должен вернуть:

  • 2018-12-20 - 12
  • 2018-12-21 - 23
  • 2018-12-22 -31
  • 2018-12-23 - 42

В моем реальном сценарии дата - это дата-время - каждые 15 минут.И я должен получить данные за прошлый месяц .. это дает как (60/15) * 24 * 30 = 2880 пунктов, и я должен нарисовать несколько ребер на одном графике.Так как же сделать это эффективно?(Я должен использовать MS SQL)

1 Ответ

0 голосов
/ 21 декабря 2018

Если я правильно понимаю, вы, похоже, хотите GROUP BY с какой-то "первой" логикой.Однако не существует «первой» функции агрегирования, поэтому вы можете использовать оконную функцию:

SELECT DISTINCT d.date,
       FIRST_VALUE(d.value) OVER (PARTITION BY d.date ORDER BY em.order)
FROM meas_point_data d JOIN
     edge_meas_point em 
     ON em.meas_point_id = d.meas_point_id
WHERE em.edge_id = 1;
...