要知道哪个时期有很多记录

时间:2019-05-02 06:07:44

标签: google-bigquery

我有下面的表格。
时间段的条件是0到6、7到12、13到18
是否有任何单个查询来获取此输出?

sellingMaterial  sellingTime

SAMSUNG             2
SAMSUNG             4
SAMSUNG             3
NOKIA               5
NOKIA               13
NOKIA               10
APPLE               12
APPLE               7
APPLE               15

Expected output is

Time Period   sellingMaterial    
0 to 6        SAMSUNG

1 个答案:

答案 0 :(得分:1)

以下是用于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     
  

我希望哪个时间记录最多[sellingMaterial]

#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  
相关问题