Чтобы знать, какой период времени имеют много записей - PullRequest
1 голос
/ 02 мая 2019

У меня есть таблица, подобная приведенной ниже.
Условие периода времени: от 0 до 6, от 7 до 12, от 13 до 18
Есть ли какой-либо один запрос для получения этого вывода?

<b>sellingMaterial  sellingTime</b>

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

Expected output is

<b>Time Period   sellingMaterial</b>    
0 to 6        SAMSUNG

1 Ответ

1 голос
/ 02 мая 2019

Ниже для BigQuery Standard 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...