Google bigquery 条件前一天的计数

Google bigquery 条件前一天的计数,google-bigquery,Google Bigquery,我有一个代码,可以按出发日期计算从公交车出发的每条路线,但我需要在工作日计算出发的前一天:周三、周五和周日 例如,如果148号线路上有1辆公交车,日期为:“2019-02-05,星期二”,我希望这一数字在“2019-02-06,星期三”中计数,并在这一天计数 这是按日期计数的正常输入: Select departureDate, countif(Route) from table group by departureDate 此查询提供了实际结果: departure

我有一个代码,可以按出发日期计算从公交车出发的每条路线,但我需要在工作日计算出发的前一天:周三、周五和周日

例如,如果148号线路上有1辆公交车,日期为:“2019-02-05,星期二”,我希望这一数字在“2019-02-06,星期三”中计数,并在这一天计数

这是按日期计数的正常输入:

   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路公交车,现在我对符号“+”有问题,我已经回答了你原来的问题-请接受它并发布你的下一个问题,我(或这里的其他人)将很乐意进一步帮助你。对不起,它不起作用,我将再次发布更多细节