基于优先级的数据行 SQL 优化
priority based data rows SQL optimization
Table meas_point:
- 编号
- 名字
Table 边缘:
- 编号
- 名字
Table meas_point_data:
- 编号
- meas_point_id(外键)
- 日期
- 值
Table edge_meas_point:
- 编号
- edge_id(外键)
- meas_point_id(外键)
- 订单(整数)
示例数据:
meas_point(id, 姓名):
- 1,测量 1
- 2, meas2
- 3, meas3
edge(id, name):
- 1,边缘 1
edge_meas_point(id, edge_id, meas_point_id, order):
- 1, 1, 1, 3
- 2, 1, 2, 1
- 3、1、3、2
meas_point_data(id, meas_point_id, date, value):
- 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
想法
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:
- 2018-12-20 - 12
- 2018-12-21 - 23
- 2018-12-22 - 31
- 2018-12-23 - 42
在我的真实场景中,日期是日期时间——每 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;
Table meas_point:
- 编号
- 名字
Table 边缘:
- 编号
- 名字
Table meas_point_data:
- 编号
- meas_point_id(外键)
- 日期
- 值
Table edge_meas_point:
- 编号
- edge_id(外键)
- meas_point_id(外键)
- 订单(整数)
示例数据:
meas_point(id, 姓名):
- 1,测量 1
- 2, meas2
- 3, meas3
edge(id, name):
- 1,边缘 1
edge_meas_point(id, edge_id, meas_point_id, order):
- 1, 1, 1, 3
- 2, 1, 2, 1
- 3、1、3、2
meas_point_data(id, meas_point_id, date, value):
- 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
想法
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:
- 2018-12-20 - 12
- 2018-12-21 - 23
- 2018-12-22 - 31
- 2018-12-23 - 42
在我的真实场景中,日期是日期时间——每 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;