我如何使用MySQL5.6.43在不创建视图
的情况下使下面的代码工作呢?
DROP VIEW IF EXISTS sla_calculation;
CREATE VIEW sla_calculation AS SELECT clock FROM service_alarms WHERE (serviceid = 473) AND
(clock >= get_unix_init_clock(30, 'day'));
SELECT sla1.clock - sla2.clock AS failure_time
FROM sla_calculation AS sla1
LEFT JOIN sla_calculation AS sla2
ON sla2.clock = (
SELECT MAX(clock)
FROM sla_calculation AS sla3
WHERE sla3.clock < sla1.clock
)
ORDER BY sla1.clock
我不想创建视图
,因为这个查询将位于函数内部(更不用说它将在中包含变量,其中
)。 我尝试了以下查询,但未成功(收到错误代码1146:表'test.sla1'不存在
):
SELECT sla1.clock - sla2.clock AS failure_time
FROM
(
SELECT clock
FROM service_alarms
WHERE (serviceid = 473) AND
(clock >= get_unix_init_clock(30, 'day'))
) AS sla1
LEFT JOIN sla1 AS sla2
ON sla2.clock = (
SELECT MAX(clock)
FROM sla1 AS sla3
WHERE sla3.clock < sla1.clock
)
ORDER BY sla1.clock
我知道我不能在from
子句中使用别名,那么如何解决这个问题呢? 多谢!
您将使用lag()
:
SELECT clock - LAG(clock, 1) ORDER BY (clock)
FROM service_alarms sa
WHERE (serviceid = 473) AND
(clock >= get_unix_init_clock(30, 'day')
ORDER BY clock;
这假定clock
具有唯一值。 如果不是,也有类似的构造,但它们稍微复杂一点。
替代方案都需要MySQL8.0。
lag()
。如果您还没有使用MySQL8.0,那么我认为您必须使用视图。