sql - 在 StandardSQL 中按时间戳对访问进行排名
问题描述
我正在建立用户与网站交互的日志,到目前为止,每次访问都有一行显示推荐渠道和时间戳:
我想visit_ref
按日期对每个人进行排名,以便在我查询的日期范围内,最近的排名最高,最远的排名最低。
到目前为止,这是我的代码,删除了通道以使其更易于阅读:
SELECT TIMESTAMP_SECONDS(visitStartTime) AS stamp,
customDimension.value AS UserID,
CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)) AS visit_ref,
COUNT(DISTINCT CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING))) OVER (PARTITION BY customDimension.value) AS total_visits_in_cycle,
RANK() OVER (PARTITION BY CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)), TIMESTAMP_SECONDS(visitStartTime) ORDER BY TIMESTAMP_SECONDS(visitStartTime)) AS visitrank,
COUNT(DISTINCT transaction.transactionid) AS orders
FROM `xxx.xxx.ga_sessions_20*` AS t
CROSS JOIN UNNEST(hits) AS hits
CROSS JOIN UNNEST(t.customdimensions) AS customDimension
WHERE parse_date('%y%m%d', _table_suffix) between
DATE_sub(current_date(), interval 3 day) and
DATE_sub(current_date(), interval 1 day)
AND customDimension.index = 2
GROUP BY 1,2,3, fullVisitorId, visitid, visitStartTime
ORDER BY UserID
LIMIT 500
在这个例子中,按排名总是回来,1
如屏幕截图所示,我怎样才能visit_ref
通过时间戳获得唯一的排名?
我想要的输出如下,其中针对此用户visitrank
显示1
了最旧的访问和3
最新的访问:
2 2018-05-07 08:02:30.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8 74664051693279955771525680150 3 2 Email - CRM Campaigns 0
3 2018-05-06 21:59:20.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8 74664051693279955771525643960 3 1 Email - CRM Campaigns 0
4 2018-05-07 05:39:15.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8 74664051693279955771525671555 3 3 Email - CRM Campaigns 0
RANK() OVER (PARTITION BY CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)), TIMESTAMP_SECONDS(visitStartTime) ORDER BY TIMESTAMP_SECONDS(visitStartTime)) AS visitrank,
我正在使用 Google BigQuery StandardSQL。
解决方案
分区窗口定义了应该考虑的记录子集。通过包含TIMESTAMP_SECONDS(visitStartTime)
,您将分区设置为始终为 1 的记录(尽管有时您的实际数据中可能会有更多记录)并且您只会看到 1 的排名。
我也不清楚为什么你需要在分区定义中进行连接/转换,尽管在这个转换过程中可能会发生一些重要的转换。我会用这个:
rank() over (partition by fullVisitorId order by timestamp_seconds(visitStartTime) desc)
推荐阅读
- angular - 如何使用角度谷歌地图显示多个标记 - 角度 6
- angular - ng2-ckeditor 中的自定义函数
- sql - ORA-12505, TNS:listener 目前不知道 11g 中连接描述符中给出的 SID
- image - 有没有办法调整颜色的亮度和强度以将可读信号(数据)引入图像并检索它
- python - Pandas:如何在 groupby 之后填充缺失的差异值?
- android - 允许许可后设备未获取位置 - React Native - Android
- android - Firebase 电话身份验证不适用于自己的设备
- javascript - 如何在 swagger express 中附加中间件,如 express-validator
- javascript - Cypress:存根打开窗口
- python - 从 dict 和 list 创建字典