在列中显示两个不同日期的数据
Posted
技术标签:
【中文标题】在列中显示两个不同日期的数据【英文标题】:Show data for two different dates in columns 【发布时间】:2015-07-13 17:59:27 【问题描述】:在 Google BigQuery 中,我想并排显示两个不同日期的数据。我想显示今天的数据,然后显示 7 天前的数据以进行比较。我的 FROM 子句选择了一系列表,每个表对应一个日期。
SELECT
DATE(TIMESTAMP(INTEGER(visitStartTime*1000000))) AS GMT_Date,
DAYOFWEEK(TIMESTAMP(INTEGER(visitStartTime*1000000))) AS GMT_Weekday,
IF(hits.customDimensions.index=15, hits.customDimensions.value, NULL) AS apikey,
hits.eventInfo.eventCategory AS event_category,
SUM(totals.visits) AS visit_count,
DATE(DATE_ADD(TIMESTAMP(INTEGER(visitStartTime*1000000)),-7,"DAY")) AS test,
// HERE I need to show SUM(totals.visits) but for the date of 'test' above
FROM (TABLE_DATE_RANGE([100610078.ga_sessions_], TIMESTAMP('20150529'),TIMESTAMP('20150711')))
WHERE
IF(hits.customDimensions.index=15, hits.customDimensions.value, NULL) IS NOT NULL
GROUP BY
GMT_Date,
GMT_Weekday,
event_category,
test,
apikey
ORDER BY
GMT_Date DESC,
visit_count DESC
LIMIT
30
“测试”之后,我想显示测试日期的访问总和。我该怎么办?我在 BigQuery 语法页面上没有看到类似的内容。
这是它当前返回的图像:http://prntscr.com/7s8w58
在“测试”列之后,我想要一个类似于 previous_week_visits 的列,它与 visit_count 具有相同的数据,但针对的是测试日期。
【问题讨论】:
您需要运行子查询。使用子查询,您将能够区分每天的访问。然后你做一个选择,每天汇总。 【参考方案1】:一种方法是使用窗口函数。您可以使用具有固定基数的 DATEDIFF 将 DATE 映射为连续的 INTEGER,然后使用 LAG 函数查找值,以下查询显示了此方法的示例:
select
d,
value,
lag(d, 3) over (order by diff) prev_d,
lag(value, 3) over (order by diff) prev_value
from (
select d, datediff(d, date('1970-01-01')) diff, value from
(select date('2012-01-01') d, 'a' value),
(select date('2012-01-02') d, 'b' value),
(select date('2012-01-03') d, 'c' value),
(select date('2012-01-04') d, 'd' value),
(select date('2012-01-05') d, 'e' value),
(select date('2012-01-06') d, 'f' value),
(select date('2012-01-07') d, 'g' value),
(select date('2012-01-08') d, 'h' value),
(select date('2012-01-09') d, 'i' value),
(select date('2012-01-10') d, 'j' value)
)
结果:
Row d value prev_d prev_value
1 2012-01-01 a null null
2 2012-01-02 b null null
3 2012-01-03 c null null
4 2012-01-04 d 2012-01-01 a
5 2012-01-05 e 2012-01-02 b
6 2012-01-06 f 2012-01-03 c
7 2012-01-07 g 2012-01-04 d
8 2012-01-08 h 2012-01-05 e
9 2012-01-09 i 2012-01-06 f
10 2012-01-10 j 2012-01-07 g
【讨论】:
谢谢,我认为这绝对是我需要的方向。为什么选择“1970-01-01”?我还能使用这个 FROM table_date_range 吗? 您可以选择任何固定日期,它仅用于将时间戳转换为连续的整数。并且您应该能够将 table_date_range 函数与窗口函数一起使用。 如果我想添加不同的数据粒度,以便每个日期有不止一行,该怎么办? lag 函数减去行数,而不是日期;有没有办法减去日期并显示值? 如果您将使用 RANGE BETWEEN UNBOUNDED PRECEDING 和 UNBOUNDED FOLLOWING 窗口 - 那么 LAG 应该减去天数,而不是行数,即您可以多次拥有同一天,并且 LAG(d, 3) 将返回尽可能远根据需要以上是关于在列中显示两个不同日期的数据的主要内容,如果未能解决你的问题,请参考以下文章