您的时间分段存在一些问题。
- 您没有捕捉到负数或零小时,因此它们将被归类为“>5”
- 您与任何地方的 24、48、72、96 小时都不匹配
- 2秒的时差,被
TIMEDIFF标记为1小时可能没问题
SELECT
ASSET_CHECKED_IN_AT,
STATUS_CHANGED_TO_COMPLETE_HERE_AT,
TIMEDIFF('HOUR', ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT) as hour_diff,
CASE
WHEN hour_diff >0 AND hour_diff <24 then '0-24 HOURS'
WHEN hour_diff >24 AND hour_diff <48 then '24-48 HOURS'
WHEN hour_diff >48 AND hour_diff <72 then '48-72 HOURS'
WHEN hour_diff >72 AND hour_diff <96 then '72-96 HOURS'
WHEN hour_diff >96 AND hour_diff <120 then '96-120 HOURS'
else '>5 DAYS'
End as Case_Age_Category,
(date_part(epoch_second, STATUS_CHANGED_TO_COMPLETE_HERE_AT::timestamp_ntz)-date_part(epoch_second, ASSET_CHECKED_IN_AT::timestamp_ntz))/3600 as hour_diff_2
FROM VALUES
('2021-01-23 13:45:00','2021-01-23 13:45:00'),
('2021-01-23 13:45:00','2021-01-23 14:40:00'),
('2021-01-23 13:45:00','2021-01-23 14:44:00'),
('2021-01-23 13:59:59','2021-01-23 14:00:01'),
('2021-01-23 13:45:00','2021-01-24 13:45:00'),
('2021-01-23 13:45:00','2021-01-27 13:45:00'),
('2021-01-24 13:45:00','2021-01-23 13:45:00')
v(ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT);
给予:
| ASSET_CHECKED_IN_AT |
STATUS_CHANGED_TO_COMPLETE_HERE_AT |
HOUR_DIFF |
CASE_AGE_CATEGORY |
HOUR_DIFF_2 |
| 2021-01-23 13:45:00 |
2021-01-23 13:45:00 |
0 |
>5 DAYS |
0 |
| 2021-01-23 13:45:00 |
2021-01-23 14:40:00 |
1 |
0-24 HOURS |
0.916667 |
| 2021-01-23 13:45:00 |
2021-01-23 14:44:00 |
1 |
0-24 HOURS |
0.983333 |
| 2021-01-23 13:59:59 |
2021-01-23 14:00:01 |
1 |
0-24 HOURS |
0.000556 |
| 2021-01-23 13:45:00 |
2021-01-24 13:45:00 |
24 |
>5 DAYS |
24 |
| 2021-01-23 13:45:00 |
2021-01-27 13:45:00 |
96 |
>5 DAYS |
96 |
| 2021-01-24 13:45:00 |
2021-01-23 13:45:00 |
-24 |
>5 DAYS |
-24 |
接下来,在 CASE 中评估的 WHEN 子句的顺序是呈现的顺序,因此您可以使用它来删除一半的评估,并且如果您将时间差作为顶级列,您的 SQL 更具可读性。
鉴于这将进入另一层 SQL,额外的列是正常工作的,是使 SQL 更具可读性的一种相当不错的方法。
SELECT
ASSET_CHECKED_IN_AT,
STATUS_CHANGED_TO_COMPLETE_HERE_AT,
TIMEDIFF('HOUR', ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT) as hour_diff,
CASE
WHEN hour_diff <0 then '-ve HOURS'
WHEN hour_diff <24 then '0-24 HOURS'
WHEN hour_diff <48 then '24-48 HOURS'
WHEN hour_diff <72 then '48-72 HOURS'
WHEN hour_diff <96 then '72-96 HOURS'
WHEN hour_diff <120 then '96-120 HOURS'
else '>=5 DAYS'
End as Case_Age_Category
FROM VALUES
('2021-01-23 13:45:00','2021-01-23 13:45:00'),
('2021-01-23 13:45:00','2021-01-23 14:40:00'),
('2021-01-23 13:45:00','2021-01-23 14:44:00'),
('2021-01-23 13:59:59','2021-01-23 14:00:01'),
('2021-01-23 13:45:00','2021-01-24 13:45:00'),
('2021-01-23 13:45:00','2021-01-27 13:45:00'),
('2021-01-24 13:45:00','2021-01-23 13:45:00')
v(ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT);
| ASSET_CHECKED_IN_AT |
STATUS_CHANGED_TO_COMPLETE_HERE_AT |
HOUR_DIFF |
CASE_AGE_CATEGORY |
| 2021-01-23 13:45:00 |
2021-01-23 13:45:00 |
0 |
0-24 HOURS |
| 2021-01-23 13:45:00 |
2021-01-23 14:40:00 |
1 |
0-24 HOURS |
| 2021-01-23 13:45:00 |
2021-01-23 14:44:00 |
1 |
0-24 HOURS |
| 2021-01-23 13:59:59 |
2021-01-23 14:00:01 |
1 |
0-24 HOURS |
| 2021-01-23 13:45:00 |
2021-01-24 13:45:00 |
24 |
24-48 HOURS |
| 2021-01-23 13:45:00 |
2021-01-27 13:45:00 |
96 |
96-120 HOURS |
| 2021-01-24 13:45:00 |
2021-01-23 13:45:00 |
-24 |
-ve HOURS |
所以现在介绍另一种计算百分比的方法,RATIO_TO_REPORT
所以你可以使用 Lukasz 展示的 DIV0 方法,我在下面解构了它,但 RETIO_TO_REPORT 完成了提升,我以多种形式展示它以表明它对解构/组合版本感到满意:
With data AS (
SELECT *
FROM VALUES
('2021-01-23 13:45:00','2021-01-23 13:45:00'),
('2021-01-23 13:45:00','2021-01-23 14:40:00'),
('2021-01-23 13:45:00','2021-01-23 14:44:00'),
('2021-01-23 13:59:59','2021-01-23 14:00:01'),
('2021-01-23 13:45:00','2021-01-24 13:45:00'),
('2021-01-23 13:45:00','2021-01-27 13:45:00'),
('2021-01-24 13:45:00','2021-01-23 13:45:00')
v(ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT)
), cat_data AS (
SELECT
ASSET_CHECKED_IN_AT,
STATUS_CHANGED_TO_COMPLETE_HERE_AT,
TIMEDIFF('HOUR', ASSET_CHECKED_IN_AT, STATUS_CHANGED_TO_COMPLETE_HERE_AT) as hour_diff,
CASE
WHEN hour_diff <0 then '-ve HOURS'
WHEN hour_diff <24 then '0-24 HOURS'
WHEN hour_diff <48 then '24-48 HOURS'
WHEN hour_diff <72 then '48-72 HOURS'
WHEN hour_diff <96 then '72-96 HOURS'
WHEN hour_diff <120 then '96-120 HOURS'
else '>=5 DAYS'
End as Case_Age_Category
FROM data
)
SELECT Case_Age_Category
,COUNT(1) as cat_count
,SUM(cat_count) OVER() as total_count_a
,DIV0(cat_count, total_count_a) as percentage
,RATIO_TO_REPORT(cat_count) over () as percentage_2
,RATIO_TO_REPORT(COUNT(1)) over () as percentage_3
,RATIO_TO_REPORT(COUNT(Case_Age_Category)) over () as percentage_4
FROM cat_data
GROUP BY 1;
给予:
| CASE_AGE_CATEGORY |
CAT_COUNT |
TOTAL_COUNT_A |
PERCENTAGE |
PERCENTAGE_2 |
PERCENTAGE_3 |
PERCENTAGE_4 |
| 0-24 HOURS |
4 |
7 |
0.571428 |
0.571429 |
0.571429 |
0.571429 |
| 24-48 HOURS |
1 |
7 |
0.142857 |
0.142857 |
0.142857 |
0.142857 |
| -ve HOURS |
1 |
7 |
0.142857 |
0.142857 |
0.142857 |
0.142857 |
| 96-120 HOURS |
1 |
7 |
0.142857 |
0.142857 |
0.142857 |
0.142857 |