google-bigquery - 要知道哪个时间段有很多记录
问题描述
我有如下表。
时间段的条件是 0 到 6、7 到 12、13 到 18
是否有任何单个查询可以获取此输出?
销售材料销售时间 三星 2 三星 4 三星 3 诺基亚 5 诺基亚 13 诺基亚 10 苹果 12 苹果 7 苹果 15 预期输出为 时间段销售材料 0 到 6 SAMSUNG
解决方案
以下是 BigQuery 标准 SQL
#standardSQL
SELECT start, finish,
STRING_AGG(
CONCAT(sellingMaterial, ':', CAST(volume AS STRING))
ORDER BY volume DESC, sellingMaterial
) sellingMaterial
FROM (
SELECT start, finish, sellingMaterial, COUNT(1) volume
FROM `project.dataset.conditions` c
JOIN `project.dataset.table` t
ON sellingTime BETWEEN start AND finish
GROUP BY start, finish, sellingMaterial
)
GROUP BY start, finish
您可以使用您问题中的示例数据进行测试,使用上面的示例数据,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'SAMSUNG' sellingMaterial, 2 sellingTime UNION ALL
SELECT 'SAMSUNG', 4 UNION ALL
SELECT 'SAMSUNG', 3 UNION ALL
SELECT 'NOKIA', 5 UNION ALL
SELECT 'NOKIA', 13 UNION ALL
SELECT 'NOKIA', 10 UNION ALL
SELECT 'APPLE', 12 UNION ALL
SELECT 'APPLE', 7 UNION ALL
SELECT 'APPLE', 15
), `project.dataset.conditions` AS (
SELECT 0 start, 6 finish UNION ALL
SELECT 7, 12 UNION ALL
SELECT 13, 18
)
SELECT start, finish,
STRING_AGG(
CONCAT(sellingMaterial, ':', CAST(volume AS STRING))
ORDER BY volume DESC, sellingMaterial
) sellingMaterial
FROM (
SELECT start, finish, sellingMaterial, COUNT(1) volume
FROM `project.dataset.conditions` c
JOIN `project.dataset.table` t
ON sellingTime BETWEEN start AND finish
GROUP BY start, finish, sellingMaterial
)
GROUP BY start, finish
-- ORDER BY start
结果
Row start finish sellingMaterial
1 0 6 SAMSUNG:3,NOKIA:1
2 7 12 APPLE:2,NOKIA:1
3 13 18 APPLE:1,NOKIA:1
我要哪个时间记录最多[卖素材]
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'SAMSUNG' sellingMaterial, 2 sellingTime UNION ALL
SELECT 'SAMSUNG', 4 UNION ALL
SELECT 'SAMSUNG', 3 UNION ALL
SELECT 'NOKIA', 5 UNION ALL
SELECT 'NOKIA', 13 UNION ALL
SELECT 'NOKIA', 10 UNION ALL
SELECT 'APPLE', 12 UNION ALL
SELECT 'APPLE', 7 UNION ALL
SELECT 'APPLE', 15
), `project.dataset.conditions` AS (
SELECT 0 start, 6 finish UNION ALL
SELECT 7, 12 UNION ALL
SELECT 13, 18
)
SELECT start, finish, sellingMaterial
FROM `project.dataset.conditions` c
JOIN `project.dataset.table` t
ON sellingTime BETWEEN start AND finish
GROUP BY start, finish, sellingMaterial
ORDER BY COUNT(1) DESC
LIMIT 1
结果
Row start finish sellingMaterial
1 0 6 SAMSUNG
推荐阅读
- html - 如何使用相对定位的子图像调整图像的大小?
- javascript - eventTarget.click() 和 eventTarget.dispatchEvent(new Event("click")) 有什么区别?
- java - Ubuntu 18.04.05 上的 Ambari 2.7.5 安装失败
- c++ - 反转单链表的特定部分,即从 m 到 n
- javascript - 在nodejs中的同一连接内运行查询
- python - Pyspark:在列和索引上排名()?
- c# - 如何使列容易可见?
- python - 我在该图片中收到有关 .kv 文件的错误,有人可以帮助我并告诉我发生了什么吗?
- firebase - Flutter:从 Google 服务帐户生成访问令牌
- javascript - Vue.js 3 - 将组件插入插槽