Countif与前一天的条件

时间:2019-02-08 19:55:01

标签: google-bigquery

我有一个代码,可以按出发日期对从公交车出发的每条路线进行计数,但是我需要在工作日(周三,周五和周日)出发的前一天进行计数。

例如,如果路线148上有1辆公交车,且日期为:“星期二,2019-02-05”,则我希望此数字在“星期三,2019-02-06”中进行计数,并以这一天为基准。< / p>

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

   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

1 个答案:

答案 0 :(得分:1)

以下是用于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