Поиск общих данных из указанной c даты с помощью bigquery - PullRequest
0 голосов
/ 13 июля 2020

Я создаю запрос с использованием bigquery, который рассчитает общее количество данных в течение 5 дней с указанной даты c для каждого идентификатора. Пока мне удалось получить результат, в котором возвращаются данные за каждый день (дни с 1 по 5), что означает, что в результате есть 5 дат. Однако на самом деле я хочу вернуть только 1 дату, которая является последней датой, поэтому она будет похожа на эту 1 дату, показывающую общие данные за последние 5 дней с указанной c даты для каждого идентификатора.

Пример данных:

enter image description here

Sample code:

  SELECT
   ID,
   Date,
    SUM(CASE WHEN Language = 'EN' THEN 1 ELSE 0 END) AS lang_EN,
    SUM(CASE WHEN Language = 'SN' THEN 1 ELSE 0 END) AS lang_SN,
     FROM (
      SELECT 
      DATE(Timestamp) as Date ,
       ID, 
      CASE 
     WHEN Language in ('EN', 'English') THEN 'EN' 
     WHEN Language in ('MY', 'Malay')  THEN 'MY' ELSE Language 
     END AS Language,  
           FROM t
           WHERE Smooch_User_ID IS NOT NULL AND DATE(Timestamp) between '2020-01-01' and '2020-01-31'
           GROUP BY   ID, Language, DATE(Timestamp) 
         )
          GROUP BY  ID,Date

Sample output:

So far, the query return the data for each date from day 1 to 5. How to make it so it returns the overall data from date 1 to 5 and also return column date only for the day 5's date like below (assuming day 1 is 2020-01-01 and day 5 is 2020-01-05).
введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Я думаю, что один из подходов может заключаться в объявлении переменных, если вы используете скрипт, чтобы вы могли извлекать / отмечать свой вывод для end_date в вашем интервале. Например,

    declare end_dt date default "2020-07-05"; -- this can be used as placeholder and replaced at run-time based on execution
    declare start_dt date default DATE_SUB(end_dt, INTERVAL 5 DAY);
    
    select 
      end_dt as ts_date, 
      id, 
      sum(CASE WHEN lang = 'EN' THEN 1 ELSE 0 END) AS lang_EN, 
      sum(CASE WHEN lang = 'SN' THEN 1 ELSE 0 END) AS lang_SN 
    from(
      -- sample data
      select cast("2020-07-01 01:01:25.550 UTC" as timestamp) as ts, "A" as id, "EN" as lang
      union all
      select cast("2020-07-01 01:01:25.550 UTC" as timestamp) as ts, "A" as id, "EN" as lang
      union all
      select cast("2020-07-01 01:01:25.550 UTC" as timestamp) as ts, "A" as id, "SN" as lang
      union all
      select cast("2020-07-02 01:01:25.550 UTC" as timestamp) as ts, "B" as id, "EN" as lang
      union all
      select cast("2020-07-02 01:01:25.550 UTC" as timestamp) as ts, "B" as id, "EN" as lang
      union all
      select cast("2020-07-02 01:01:25.550 UTC" as timestamp) as ts, "B" as id, "SN" as lang
      union all
      select cast("2020-07-02 01:01:25.550 UTC" as timestamp) as ts, "B" as id, "SN" as lang
      union all
      select cast("2020-07-03 01:01:25.550 UTC" as timestamp) as ts, "C" as id, "SN" as lang
      union all
      select cast("2020-07-03 01:01:25.550 UTC" as timestamp) as ts, "C" as id, "EN" as lang
      union all
      select cast("2020-07-03 01:01:25.550 UTC" as timestamp) as ts, "D" as id, "SN" as lang
      union all
      select cast("2020-07-04 01:01:25.550 UTC" as timestamp) as ts, "D" as id, "EN" as lang
    ) where date(ts) between start_dt and end_dt
    group by 1,2

И вывод:

Row     ts_date     id  lang_EN     lang_SN      
1       2020-07-05  A   2           1    
2       2020-07-05  B   2           2    
3       2020-07-05  C   1           1    
4       2020-07-05  D   1           1
0 голосов
/ 13 июля 2020

Ваш запрос намного сложнее, чем необходимо. Вам вообще не нужен подзапрос, если вы используете COUNT(DISTINCT):

SELECT ID, 
       COUNT(DISTINCT Language in ('EN', 'English') THEN DATE(timestamp) END) AS lang_EN,
       COUNT(DISTINCT Language in ('MY', 'Malay') THEN DATE(timestamp) END) AS lang_SN
FROM t
WHERE Smooch_User_ID IS NOT NULL AND
      DATE(Timestamp) <= DATE('2020-01-31') AND
      DATE(Timestamp) >= DATE_ADD(DATE('2020-01-31'), INTERVAL 5 DAY)
GROUP BY ID;

Я думаю, что это также фиксирует дату logi c, которую вы пытаетесь реализовать.

...