给定以下数据库表,该表记录不同对象(id)的事件(状态)及其时间戳:
ID | Date | Time | Status
-------------------------------
7 | 2016-10-10 | 8:23 | Passed
7 | 2016-10-10 | 8:29 | Failed
7 | 2016-10-13 | 5:23 | Passed
8 | 2016-10-09 | 5:43 | Passed
我想使用普通 SQL(MS SQL)得到一个结果表,如下所示:
ID | Date | Status
------------------------
7 | 2016-10-10 | Failed
7 | 2016-10-13 | Passed
8 | 2016-10-09 | Passed
其中“状态”是一天中的最新条目,因为已记录了该对象的至少一个事件。
我目前的解决方案是像这样使用“外部应用”和“TOP(1)”:
SELECT DISTINCT rn.id,
tmp.date,
tmp.status
FROM run rn OUTER apply
(SELECT rn2.date, tmp2.status AS 'status'
FROM run rn2 OUTER apply
(SELECT top(1) rn3.id, rn3.date, rn3.time, rn3.status
FROM run rn3
WHERE rn3.id = rn.id
AND rn3.date = rn2.date
ORDER BY rn3.id ASC, rn3.date + rn3.time DESC) tmp2
WHERE tmp2.status <> '' ) tmp
据我了解,这个外部应用命令的工作方式如下:
For every id
For every recorded day for this id
Select the newest status for this day and this id
但是我面临性能问题,因此我认为这个解决方案是不够的。任何建议如何解决这个问题或如何优化 sql?