22,207
社区成员
发帖
与我相关
我的任务
分享
;WITH
--测试数据
tab([time],pv)AS(
select '2017/2/20 0:00',537 union all
select '2017/2/19 2:00',510 union all
select '2017/2/19 1:00',500 union all
select '2017/2/19 0:00',491 union all
select '2017/2/18 0:00',465
),
--测试数据结束
tempa AS (
SELECT CONVERT(NVARCHAR(10), [time], 120) AS [date] ,
MIN([time]) AS [time] ,
ROW_NUMBER() OVER ( ORDER BY MIN([time]) ) AS num
FROM tab
GROUP BY CONVERT(NVARCHAR(10), [time], 120)
)
,tempb AS (
SELECT a.*,b.num FROM tab a JOIN tempa b ON a.time = b.time
)
SELECT a.time ,
( CASE WHEN ( b.pv - a.pv ) > 24 THEN 24
ELSE b.pv - a.pv
END ) AS pv
FROM tempb a
LEFT JOIN tempb b ON b.num - a.num = 1
WHERE b.time IS NOT NULL
WITH
/* 测试数据
t1(time1,pv)AS(
SELECT '2017/2/19 23:30',536 UNION ALL
SELECT '2017/2/19 23:00',535 UNION ALL
SELECT '2017/2/19 22:30',534 UNION ALL
SELECT '2017/2/19 22:00',533 UNION ALL
SELECT '2017/2/19 21:30',532 UNION ALL
SELECT '2017/2/19 21:00',531 UNION ALL
SELECT '2017/2/19 20:30',530 UNION ALL
SELECT '2017/2/19 20:00',529 UNION ALL
SELECT '2017/2/19 19:30',529 UNION ALL
SELECT '2017/2/19 19:00',528 UNION ALL
SELECT '2017/2/19 18:30',527 UNION ALL
SELECT '2017/2/19 18:00',526 UNION ALL
SELECT '2017/2/19 17:30',525 UNION ALL
SELECT '2017/2/19 17:00',524 UNION ALL
SELECT '2017/2/19 16:30',523 UNION ALL
SELECT '2017/2/19 16:00',522 UNION ALL
SELECT '2017/2/19 15:30',521 UNION ALL
SELECT '2017/2/19 15:00',520 UNION ALL
SELECT '2017/2/19 14:30',519 UNION ALL
SELECT '2017/2/19 14:00',518 UNION ALL
SELECT '2017/2/19 13:30',517 UNION ALL
SELECT '2017/2/19 13:00',516 UNION ALL
SELECT '2017/2/19 12:30',515 UNION ALL
SELECT '2017/2/19 12:00',514 UNION ALL
SELECT '2017/2/19 11:30',513 UNION ALL
SELECT '2017/2/19 11:00',512 UNION ALL
SELECT '2017/2/19 10:30',511 UNION ALL
SELECT '2017/2/19 10:00',510 UNION ALL
SELECT '2017/2/19 9:30',509 UNION ALL
SELECT '2017/2/19 9:00',508 UNION ALL
SELECT '2017/2/19 8:30',507 UNION ALL
SELECT '2017/2/19 8:00',506 UNION ALL
SELECT '2017/2/19 7:30',505 UNION ALL
SELECT '2017/2/19 7:00',504 UNION ALL
SELECT '2017/2/19 6:30',503 UNION ALL
SELECT '2017/2/19 6:00',502 UNION ALL
SELECT '2017/2/19 5:30',501 UNION ALL
SELECT '2017/2/19 5:00',500 UNION ALL
SELECT '2017/2/19 4:30',499 UNION ALL
SELECT '2017/2/19 4:00',498 UNION ALL
SELECT '2017/2/19 3:30',497 UNION ALL
SELECT '2017/2/19 3:00',497 UNION ALL
SELECT '2017/2/19 2:30',496 UNION ALL
SELECT '2017/2/19 2:00',495 UNION ALL
SELECT '2017/2/19 1:30',494 UNION ALL
SELECT '2017/2/19 1:00',493 UNION ALL
SELECT '2017/2/19 0:30',492 UNION ALL
SELECT '2017/2/19 0:00',491 UNION ALL
SELECT '2017/2/18 23:30',490 UNION ALL
SELECT '2017/2/18 23:00',489 UNION ALL
SELECT '2017/2/18 22:30',488 UNION ALL
SELECT '2017/2/18 22:00',486 UNION ALL
SELECT '2017/2/18 21:30',485 UNION ALL
SELECT '2017/2/18 21:00',484 UNION ALL
SELECT '2017/2/18 20:30',483 UNION ALL
SELECT '2017/2/18 20:00',482 UNION ALL
SELECT '2017/2/18 19:30',481 UNION ALL
SELECT '2017/2/18 19:00',480 UNION ALL
SELECT '2017/2/18 18:30',479 UNION ALL
SELECT '2017/2/18 18:00',478 UNION ALL
SELECT '2017/2/18 17:30',477 UNION ALL
SELECT '2017/2/18 17:00',476 UNION ALL
SELECT '2017/2/18 16:30',475 UNION ALL
SELECT '2017/2/18 16:00',474 UNION ALL
SELECT '2017/2/18 15:30',473 UNION ALL
SELECT '2017/2/18 15:00',472 UNION ALL
SELECT '2017/2/18 14:30',471 UNION ALL
SELECT '2017/2/18 14:00',470 UNION ALL
SELECT '2017/2/18 13:30',470 UNION ALL
SELECT '2017/2/18 13:00',469 UNION ALL
SELECT '2017/2/18 12:30',468 UNION ALL
SELECT '2017/2/18 12:00',468 UNION ALL
SELECT '2017/2/18 11:30',467 UNION ALL
SELECT '2017/2/18 11:00',466 UNION ALL
SELECT '2017/2/18 10:30',466 UNION ALL
SELECT '2017/2/18 10:00',465 UNION ALL
SELECT '2017/2/18 9:30',465 UNION ALL
SELECT '2017/2/18 9:00',465 UNION ALL
SELECT '2017/2/18 8:30',465 UNION ALL
SELECT '2017/2/18 8:00',465 UNION ALL
SELECT '2017/2/18 7:30',465 UNION ALL
SELECT '2017/2/18 7:00',465 UNION ALL
SELECT '2017/2/18 6:30',465 UNION ALL
SELECT '2017/2/18 6:00',465 UNION ALL
SELECT '2017/2/18 5:30',465 UNION ALL
SELECT '2017/2/18 5:00',465 UNION ALL
SELECT '2017/2/18 4:30',465 UNION ALL
SELECT '2017/2/18 4:00',465 UNION ALL
SELECT '2017/2/18 3:30',465 UNION ALL
SELECT '2017/2/18 3:00',465 UNION ALL
SELECT '2017/2/18 2:30',465 UNION ALL
SELECT '2017/2/18 2:00',465 UNION ALL
SELECT '2017/2/18 1:30',465 UNION ALL
SELECT '2017/2/18 1:00',465 UNION ALL
SELECT '2017/2/18 0:30',465 UNION ALL
SELECT '2017/2/18 0:00',465
),
*/
a(dt,min_pv,max_pv)AS(
SELECT CONVERT(varchar(10),t1.Time1,120),
MIN(pv),
MAX(pv)
FROM t1
GROUP BY CONVERT(varchar(10),t1.Time1,120)
)
SELECT a1.dt,
a1.min_pv, -- DEBUG
ISNULL(a2.min_pv,a1.max_pv) AS max_pv, -- DEBUG
ISNULL(a2.min_pv,a1.max_pv) - a1.min_pv AS delta_pv
FROM a a1
LEFT JOIN a a2
ON DATEADD(day,1,a1.dt) = a2.dt
dt min_pv max_pv delta_pv
---------- ----------- ----------- -----------
2017/2/18 465 491 26
2017/2/19 491 536 45