BIGQUERY - 如何按特定日期使用求和函数?

Posted

技术标签:

【中文标题】BIGQUERY - 如何按特定日期使用求和函数?【英文标题】:BIGQUERY - HOW TO USE SUM FUNCTION BY SPECIFIC DATE? 【发布时间】:2018-09-18 04:53:28 【问题描述】:

所以基本上,我想按日期计算 EST_VIEWS 的总和,它在 "2018-09-07" and "2018-09-13" 之间累积。我该怎么做?

Row CMS_ID  VIDEO_ID    CHANNEL_ID  TITLE   EST_VIEWS   DATE     
1   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    1   2018-09-10   
2   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    3   2018-09-07   
3   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    1   2018-09-09   
4   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    3   2018-09-11   
5   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2   2018-09-13   
6   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    1   2018-09-12   
7   2   V133h8Rn8W0 UC-CcF1XGCRASDRrEOI_zEnQ    Michael Jackson Nhí - Châu Phát Luân Ngôi Sao Nhí Trại Hè Trường Anh Ngữ RES 2018   1   2018-09-11   
8   2   V133h8Rn8W0 UC-CcF1XGCRASDRrEOI_zEnQ    Michael Jackson Nhí - Châu Phát Luân Ngôi Sao Nhí Trại Hè Trường Anh Ngữ RES 2018   1   2018-09-12   

结果:

Row CMS_ID  VIDEO_ID    CHANNEL_ID  TITLE   DATE    total    
1   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-10  1    
2   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-11  3    
3   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-07  3    
4   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-09  1    
5   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-12  1    
6   2   WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ    Con Két Quậy    2018-09-13  2    

【问题讨论】:

【参考方案1】:

由于您希望查看给定范围内的所有日期,即使您的源表可能没有这些日期的任何条目,我们也可以在这种情况下使用日历表。鉴于您想要的范围很小,以下应该就足够了:

WITH dates AS (
    SELECT DATE("2018-09-07") AS DATE UNION ALL
    SELECT DATE("2018-09-08") UNION ALL
    SELECT DATE("2018-09-09") UNION ALL
    SELECT DATE("2018-09-10") UNION ALL
    SELECT DATE("2018-09-11") UNION ALL
    SELECT DATE("2018-09-12") UNION ALL
    SELECT DATE("2018-09-13")
)

SELECT
    t1.DATE,
    SUM(t2.EST_VIEWS) OVER (ORDER BY t1.DATE) AS total
FROM dates t1
LEFT JOIN yourTable t2
    ON t1.DATE = t2.DATE
GROUP BY
    t1.DATE;

请注意,如果您需要更大范围的日期,那么您可能需要一种更简洁、更自动化的方式来生成日历表。 See this SO question 一些选项。

【讨论】:

我试过你的方法。但是我还是没有得到预期的结果Row CMS_ID VIDEO_ID CHANNEL_ID TITLE DATE total 1 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-10 1 2 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-11 3 3 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-07 3 4 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-09 1 5 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-12 1 6 2 WKqQSws7CRM UC-CcF1XGCRASDRrEOI_zEnQ Con Két Quậy 2018-09-13 2 这里很难看,我把结果贴出来 您要报告所有日期,甚至是那些没有出现在您的表格中的日期吗? 是的,我想报告所有日期,我的意思是我想要一个表格,由每个 VIDEO_ID 计算 SUMEST_VIEWS(在 '2018-09-07' 和 '2018-09 之间累积) -13') @PhucTrinh 我更新了我的答案以使用日历表。【参考方案2】:

我想我明白了,你想知道一个 VIDEO_ID 在“2018-09-07”和“2018-09-13”之间有多少观看次数,如果我错了,请纠正我。因此,如果一个 VIDEO_ID 在 2018 年 9 月 7 日被看到一次,在 2018 年 9 月 8 日被看到两次,并且在本周的剩余时间里都没有看到,那么总和是 3。

您应该使用where 子句:

SELECT 
   VIDEO_ID,
   SUM(EST_VIEWS)
WHERE
   DATE(DATE)
BETWEEN 
   DATE('2018-09-07') AND DATE('2018-09-13')
GROUP BY
   VIDEO_ID

【讨论】:

以上是关于BIGQUERY - 如何按特定日期使用求和函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何求和具有特定查找字段值的记录数

如何将特定日期格式加载到 BigQuery

如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0

如何在Java中求和两个特定的日期

BigQuery:按开始日期和结束日期描述的用户元数据 - 创建跨多个表的排列

BigQuery 中按键(或对称聚合)函数求和不同