SQL 服务器 - 从事件摘要中累积设备的唤醒时间

SQL Server - Cumulate awake time for devices from event summary

我正在 SQL 服务器(BMC 使用)上工作,以获取某些设备的正常运行时间。

我有一个显示如下结果的查询:

| DeviceName | EventDate               | EventType  |
| ---------- | ----------------------- | ---------- |
| 1          | 2021-02-15 08:06:12.000 | getting up |
| 1          | 2021-02-12 15:07:26.000 | going down |
| 2          | 2021-02-16 08:12:54.000 | getting up |
| 2          | 2021-02-12 15:43:00.000 | going down |
| 3          | 2021-02-15 07:47:42.000 | getting up |
| 3          | 2021-02-12 15:38:41.000 | going down |
| 4          | 2021-02-15 08:10:07.000 | getting up |
| 5          | 2021-02-18 06:41:40.000 | getting up |
| ...        | ...                     | ...        |

我想得到这样的结果:

| DeviceName | TotalUpTime (min) |
| ---------- | ----------------- |
| 1          | 16543             |
| 2          | 13639             |
| 3          | 13524             |
| 4          | 19235             |
| 5          | 12347             |

这是我当前的查询:

    SELECT 
        DeviceName, 
        EventDate, 
        EventType
    FROM **irrelevant complexe SELECT query**
    ORDER BY DeviceName, EventDate DESC

任何帮助都会很好!!

提前致谢!

SELECT 
    DeviceName,
    SUM(DATEDIFF(ms, EventDate, EndTime) / 60000.0) AS [TotalUpTime (min)]
FROM (
    SELECT *,
        LEAD(CASE WHEN EventType = 'going down' THEN EventDate END, 1, GETDATE()) OVER
            OVER (PARTITION BY DeviceName ORDER BY EventDate) AS EndTime
    FROM table
)
WHERE EventType = 'getting up' AND EndTime IS NOT NULL
GROUP BY DeviceName

解决方案:

好的,这对我有用:

SELECT 
    DeviceName,
    DATEDIFF(s, EventDate, EndTime)/60 AS [TotalUpTime (min)]
FROM (
    SELECT *,
        LEAD(CASE WHEN EventType = 32 THEN EventDate END, 1, GETDATE())
        OVER (PARTITION BY DeviceName ORDER BY EventDate) AS EndTime
    FROM (
        **Irrelevant SELECT query**
    ) r
) s
WHERE EventType = 16 AND EndTime IS NOT NULL

非常感谢@Charlieface,他的回复对我帮助很大。

希望有一天这对某人有所帮助,即使它非常具体。