基于优先级的数据行SQL优化

时间:2018-12-21 11:07:11

标签: sql tsql sql-optimization

meas_point

  • id
  • 名称

  • id
  • 名称

meas_point_data

  • id
  • meas_point_id(外键)
  • 日期

edge_meas_point

  • id
  • edge_id(外键)
  • meas_point_id(外键)
  • 订单(int)

示例数据

meas_point (ID,名称):

  • 1,测量1
  • 2,meas2
  • 3,meas3

边缘(ID,名称):

  • 1,edge1

edge_meas_point (id,edge_id,meas_point_id,顺序):

  • 1、1、1、3
  • 2、1、2、1
  • 3、1、3、2

meas_point_data (id,meas_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以给定的优先级(顺序)将edge与meas_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

在WHERE中可以很好地工作一个日期,但是如果我想从该数据绘制图表怎么办?根据此示例,我的选择应返回:

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

在我的实际情况中,日期是datetime-每15分钟一次。而且我必须获取上个月的数据..这得到(60/15)* 24 * 30 = 2880点,我必须在一张图表上画几条边。那么如何有效地做到这一点呢? (我必须使用MS SQL)

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,您似乎希望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; 具有某种“第一”逻辑。但是,由于没有“第一”聚合功能,因此可以使用窗口功能:

<style name="PopupMenu" parent="Theme.AppCompat.Light">
    <item name="android:popupBackground">@android:color/white</item>
</style>