google-bigquery - 在给定日期范围(日历)内具有开始日期和结束日期的活跃工单的每日计数
问题描述
我想计算有效票,我有每张票的开始和结束日期。我需要两个日期之间的每日总数(日历)
这是票表(MINITABLE)
Ticket Created Closed
MAS-10772905 2020-04-20T14:00:00
MAS-11542813 2020-07-28T16:00:00 2020-07-30T10:00:00
MAS-11850014 2020-09-04T04:00:00
MAS-13926615 2021-02-26T02:00:00
MAS-11960295 2020-09-16T10:00:00 2020-09-16T06:00:00
MAS-12301712 2020-10-27T23:00:00 2021-01-02T04:00:00
MAS-11850014 2020-09-04T23:00:00
MAS-12361774 2020-11-02T08:00:00
MAS-13141083 2021-01-02T11:00:00
MAS-13144525 2021-01-02T14:00:00
...
这就是我想要得到的
Start Active Tickets
2020-01-01 10
2020-01-02 8
2020-01-03 14
2020-01-04 13
2020-01-05 11
2020-01-06 16
...
我尝试通过此查询执行此操作,但不工作......它给了我以下失败消息:“如果没有来自连接双方的字段相等的条件,则无法使用 LEFT OUTER JOIN。”
SELECT start, COUNT(DISTINCT Ticket) AS Actived
FROM (SELECT
CAST(CONCAT(DATE(calendar)," ", TIME(00,00,00)) AS DATETIME) AS start,
CAST(CONCAT(DATE(calendar)," ", TIME(22,00,00)) AS DATETIME) AS ending
FROM
UNNEST(GENERATE_DATE_ARRAY('2020-01-01', (CURRENT_DATE()), INTERVAL 1 DAY)) AS calendar
ORDER BY start ASC) calendar
LEFT JOIN MINITABLE ON (start BETWEEN Created AND Closed) OR
(ending BETWEEN Created AND Closed) OR
(Created >= start AND Closed <= ending) OR
(Created <= start AND Closed >= ending)
GROUP BY start
ORDER BY start ASC
任何帮助将非常感激!非常感谢你 :)
解决方案
考虑下面
select date(timestamp_trunc(hour, day)) day,
count(distinct Ticket) Active_Tickets
from `project.dataset.minitable`,
unnest(generate_timestamp_array(timestamp(created), ifnull(current_timestamp(), timestamp(closed)), interval 1 hour)) hour
group by day
首先在这里-您将每个条目行拆分/扩展为相应的每小时行-与创建和关闭之间的小时数一样多的行(如果关闭为空,则将其替换为当前时间戳)。然后您只需按天分组并计算不同的门票 - 就这么简单
推荐阅读
- json - 如何使用 Vue 从 json 对象中获取父元素
- data-structures - 删除链表
- laravel - Laravel - 使用 Rule 类自定义错误消息
- android - 尽管传递了项目 ID,但仍获得 ResourceNotFoundException
- cypress - 如何单击柏树中的链接
- java - 将外部类的值设置为内部类中检索到的值
- jquery-ui - 如何在向上拖动时修复“可调整大小框下的这个移动框
- android - 未解决的依赖关系:找不到任何与 com.android.support:appcompat-v7:29.+ 匹配的版本
- javascript - 如何使这个功能更小?
- c# - 在编辑器会话之间存储编辑器值