sql - 列值更改时 SQL 重置 row_number
问题描述
我一直在尝试解决这个问题,但没有这样做。我需要获取服务器不可用的持续时间。这是以下数据
Date | Time | Address | Status
11-14 | 6:32 | 1.1.1.1 | Down --- Count Start
11-14 | 6:34 | 1.1.1.1 | Down
11-14 | 6:54 | 1.1.1.1 | UP
11-14 | 7:20 | 1.1.1.1 | Down --- Reset Count to 1
11-14 | 7:25 | 1.1.1.1 | Down
11-14 | 7:30 | 1.1.1.1 | Up
11-14 | 7:40 | 1.1.1.1 | Down --- Reset Count to 1
11-14 | 6:35 | 2.2.2.2 | Down --- Now this is a different counter cause of different IP
我有这个查询
SELECT [date]
,[time]
,[address]
,[ms]
,[bytes]
,[ttl]
,[Status]
,COALESCE(lag([Status]) over(order by [time]),'--') [Row]
INTO #temp
FROM
(
SELECT [date]
,[time]
,[address]
,[ms]
,[bytes]
,[ttl]
,CASE WHEN [status] = 'Success' THEN 'UP' ELSE 'DOWN' END [Status]
FROM [ESPS].[dbo].[Ping History] p
INNER JOIN [SuperDashboard].[dbo].[IP_Mapping] i ON i.[IP] = p.address
WHERE [Date] = CONVERT(Date,GETDATE())
) a
SELECT [date]
,[time]
,[address]
,[ms]
,[bytes]
,[ttl]
,[Status]
FROM
(
SELECT [date]
,[time]
,[address]
,[ms]
,[bytes]
,[ttl]
,[Status]
,CASE WHEN [Status] != [Row] THEN 1 ELSE 0 END [row]
FROM #temp
) a WHERE [row] = 1
DROP TABLE #temp
但这仅适用于只有一个地址,因为当我尝试添加2.2.2.2
. 理想的输出是每次遇到停机时获取服务器停机的持续时间。我希望有人可以帮助我或至少为我指出正确的方向。
编辑 1:预期输出应该是
Date | Start DownTime | End DownTime | Address
11-14 | 6:32 | 6:54 | 1.1.1.1
11-14 | 7:20 | 7:30 | 1.1.1.1
11-14 | 7:40 | | 1.1.1.1
11-14 | 6:35 | | 2.2.2.2
解决方案
使用 lag() 函数
select *,case when stat='Down' and (prevval='Up' or prevval is null) then 1 else 0 end as val from
(
select *,lag(stat) over(partition by address order by address) as prevval
from #temp
)A
输出:
address stat prevval val
1.1.1.1 Down 1
1.1.1.1 Up Down 0
1.1.1.1 Down Up 1
1.1.1.1 Down Down 0
1.1.1.1 Up Down 0
1.1.1.1 Down Up 1
1.1.1.1 Down Down 0
2.2.2.2 Down 1
推荐阅读
- ruby-on-rails - translation missing:en.admin.communities.settings.payments_not_enabled Sharetribe
- r - 如何使条形图标签颜色以条形本身的颜色为条件?
- flutter - 无法在颤振中导入 url 启动器包
- azure - Azure 自定义资源提供程序长时间运行的资源创建
- python - 二维数组中的随机障碍物生成算法
- android - 使用 LiveData 的波纹效果/点击动画
- angular - 如果我重新分配一个存储 rxjs 订阅的变量,那会取消订阅吗?
- rust - 可变借用到 Mutex 内部的对象 - 如何重构?
- email - 如何在exim中自动将邮件抄送给特定收件人
- azure - 无法将服务计划连接到 vnet