Google bigquery 条件前一天的计数
我有一个代码,可以按出发日期计算从公交车出发的每条路线,但我需要在工作日计算出发的前一天:周三、周五和周日 例如,如果148号线路上有1辆公交车,日期为:“2019-02-05,星期二”,我希望这一数字在“2019-02-06,星期三”中计数,并在这一天计数 这是按日期计数的正常输入:Google bigquery 条件前一天的计数,google-bigquery,Google Bigquery,我有一个代码,可以按出发日期计算从公交车出发的每条路线,但我需要在工作日计算出发的前一天:周三、周五和周日 例如,如果148号线路上有1辆公交车,日期为:“2019-02-05,星期二”,我希望这一数字在“2019-02-06,星期三”中计数,并在这一天计数 这是按日期计数的正常输入: Select departureDate, countif(Route) from table group by departureDate 此查询提供了实际结果: departure
Select departureDate, countif(Route)
from table
group by departureDate
此查询提供了实际结果:
departureDate countif(Route)
Mon 04-feb-19 1
Tue 05-feb-19 1
Wed 06-feb-19 2
Thu 07-feb-19 1
Fri 08-feb-19 1
Sat 09-feb-19 2
Sun 10-feb-19 2
但我期待这些结果:
departureDate countif(Route) explanation
Mon 04-feb-19 0 No count
Tue 05-feb-19 0 No count
Wed 06-feb-19 3 1 + 1 + 2
Thu 07-feb-19 0 No count
Fri 08-feb-19 2 1 + 1
Sat 09-feb-19 0 No count
Sun 10-feb-19 4 2 + 2
下面是BigQuery标准SQL
#standardSQL
SELECT
departureDate,
IF(EXTRACT(DAYOFWEEK FROM departureDate) IN (1, 4, 6), ANY_VALUE(cnt), 0) cnt
FROM (
SELECT
departureDate,
COUNT(1) OVER(ORDER BY UNIX_DATE(departureDate) RANGE BETWEEN 1 PRECEDING AND CURRENT ROW) cnt
FROM `project.dataset.table`
WHERE Route = 148
)
GROUP BY departureDate
对你来说应该是个好的开始
您可以使用下面的虚拟示例中的示例数据测试、播放上述内容,该示例试图与您的示例相似
#standardSQL
WITH `project.dataset.table` AS (
SELECT DATE '2019-02-04' departureDate, 148 route UNION ALL
SELECT '2019-02-05', 148 UNION ALL
SELECT '2019-02-06', 148 UNION ALL
SELECT '2019-02-06', 148 UNION ALL
SELECT '2019-02-07', 148 UNION ALL
SELECT '2019-02-08', 148 UNION ALL
SELECT '2019-02-09', 148 UNION ALL
SELECT '2019-02-09', 148 UNION ALL
SELECT '2019-02-10', 148 UNION ALL
SELECT '2019-02-10', 148
)
SELECT
departureDate,
IF(EXTRACT(DAYOFWEEK FROM departureDate) IN (1, 4, 6), ANY_VALUE(cnt), 0) cnt
FROM (
SELECT
departureDate,
COUNT(1) OVER(ORDER BY UNIX_DATE(departureDate) RANGE BETWEEN 1 PRECEDING AND CURRENT ROW) cnt
FROM `project.dataset.table`
WHERE Route = 148
)
GROUP BY departureDate
-- ORDER BY departureDate
结果
Row departureDate cnt
1 2019-02-04 0
2 2019-02-05 0
3 2019-02-06 3
4 2019-02-07 0
5 2019-02-08 2
6 2019-02-09 0
7 2019-02-10 4
请澄清为什么在您的预期输出示例中,19年2月5日、19年2月7日和19年2月9日的计数为0(零)。另外-你应该提供显示预期输出的输入数据示例是的,有0,我不知道为什么这样显示…….我在专栏中写了我的问题是-你能解释一下为什么你希望在这些日期中看到零的逻辑吗?!并提供输入数据的示例,这些数据将给出输出-因此我们实际上可以帮助您,而不是浪费我们的时间来反向工程您的用例-请这样做;o) 我已经改了,你现在能更好地理解吗??,我想要一个日期在之前的金额抱歉坚持-但我的问题是-解释为什么19年2月5日没有“计算”的原因,19年2月7日和19年2月9日-这对您来说可能是显而易见的-但相信我-对于我们这些不了解您的用例的人来说-这是非常没有意义的,如果没有这些“不计算”的逻辑,我们将无法帮助我解决UNIX_日期(departureDate)的问题,因为这是一个日期时间,而且该函数只支持DateAnywhere-要将
DATETIME
转换为DATE
您可以使用DATE(TIMESTAMP(departureDate))
我还有两个基于countif的列,如下所示:countif(RouteId=134)+countif(RouteId=60)作为总线3,countif(RouteId=134和EXTRACT(HOUR FROM departureDate)=6)+countif(RouteId=60,EXTRACT(HOUR FROM ExtaureDate)=6)作为4路公交车,现在我对符号“+”有问题,我已经回答了你原来的问题-请接受它并发布你的下一个问题,我(或这里的其他人)将很乐意进一步帮助你。对不起,它不起作用,我将再次发布更多细节