【发布时间】:2016-12-02 22:47:14
【问题描述】:
给定以下数据库表,它记录了不同对象(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?
【问题讨论】:
标签: sql sql-server tsql optimization outer-apply