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

priority based data rows SQL optimization

Table meas_point:

Table 边缘:

Table meas_point_data:

Table edge_meas_point:

示例数据:

meas_point(id, 姓名):

edge(id, name):

edge_meas_point(id, edge_id, meas_point_id, order):

meas_point_data(id, meas_point_id, date, value):

想法

Table edge_meas_point 以给定的优先级(顺序)将边与 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 的某个日期工作得很好,但是如果我想根据该数据绘制图表怎么办?基于这个例子,我的 select 应该 return:

在我的真实场景中,日期是日期时间——每 15 分钟一次。我必须获取上个月的数据..这给出了 (60/15) * 24 * 30 = 2880 点,我必须在一张图表上画一些边。那么如何有效地做到这一点呢? (我得用MSSQL)

如果我没理解错的话,您似乎希望 GROUP BY 具有某种 "first" 逻辑。但是没有"first"聚合函数,所以可以使用window函数:

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;