我有一个代码,可以按出发日期对从公交车出发的每条路线进行计数,但是我需要在工作日(周三,周五和周日)出发的前一天进行计数。
例如,如果路线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
答案 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