Как использовать Case с чем-либо еще, когда значения это строка или дата в BigQuery? - PullRequest
1 голос
/ 26 сентября 2019

У меня есть таблица BigQuery, подобная этой:

+------+------------+------------------+
| Name |    date    | order_id | value |
+------+------------+----------+-------+
| JONES| 2019-01-03 | 11       |    10 |
| JONES| 2019-01-05 | 12       |    5  |
| JONES| 2019-06-03 | 13       |    15 |
| JONES| 2019-07-03 | 14       |    20 |
| John | 2019-07-23 | 15       |    10 |
+------+------------+----------+-------+

, и мне нужно добавить столбцы, которые имеют значения из определенного order_id (означает, что order_id, который мы не знаем, может только посчитать его), например, когда order_count будетбудет 3. Для решения первого порядка будет так, и найденный последний order_id также не является большой проблемой:

WITH data AS (
  SELECT "JONES" name, DATE("2019-01-03") date, "11" order_id, 10 value
  UNION ALL
  SELECT "JONES", DATE("2019-01-05"), "12", 5
  UNION ALL
  SELECT "JONES", DATE("2019-06-03"), "13", 15
  UNION ALL
  SELECT "JONES", DATE("2019-07-03"), "14", 20
  UNION ALL
  SELECT "John", DATE("2019-07-23"), "15", 10
)
SELECT name,
ARRAY_AGG(STRUCT(DATE as f_date) ORDER BY order_id LIMIT 1)[OFFSET(0)].*,
  max(order_id) AS l_id, 
  min(order_id) as f_id, 
  SUM(value) AS total
FROM DATA
GROUP BY name

Вывод:

+------+------+------------+-----+------+
| name | f_id | f_date     |l_id | total|
+------+------+------------+-----+------+
| JONES| 11   | 2019-01-03 | 14  | 50   | 
| John | 15   | 2019-07-23 | 15  | 10   | 
+------+------+------------+-----+------+

Есть ли так жечтобы получить значения для последнего порядка и значения, когда счетчик order_id будет равен 3 по имени?

Вывод:

+------+----------+----+----+-----+-----+----------+-----------+
| name |f_date    |f_id|l_id|total|3_id |  3_date  |  l_date   |
+------+----------+----+----+-----+-----+----------+-----------+
| JONES|2019-01-03| 11 | 14 |  50 |13   |2019-06-03| 2019-07-03|
| John |2019-07-23| 15 | 15 |  10 |NULL |NULL      | 2019-07-23|
+------+----------+----+----+-----+-----+----------+-----------+

Я полагаю, что должно быть что-то с Case, но здесь не работаетс агрегацией для нечисловых значений:

(CASE WHEN order_id = l_id THEN date ELSE Null END) AS l_date

1 Ответ

1 голос
/ 26 сентября 2019

Ниже для BigQuery Standard SQL

WITH data AS (
  SELECT "JONES" name, DATE("2019-01-03") `date`, "11" order_id, 10 value UNION ALL
  SELECT "JONES", DATE("2019-01-05"), "12", 5 UNION ALL
  SELECT "JONES", DATE("2019-06-03"), "13", 15 UNION ALL
  SELECT "JONES", DATE("2019-07-03"), "14", 20 UNION ALL
  SELECT "John", DATE("2019-07-23"), "15", 10
)
SELECT name,
  ARRAY_AGG(STRUCT(DATE AS f_date) ORDER BY order_id LIMIT 1)[OFFSET(0)].*,
  MAX(order_id) AS l_id, 
  MIN(order_id) AS f_id, 
  SUM(value) AS total,
  ARRAY_AGG(STRUCT(order_id AS `_3_order`, `date` AS `_3_date`) ORDER BY order_id LIMIT 3)[SAFE_OFFSET(2)].*,
  ARRAY_AGG(STRUCT(`date` AS l_date) ORDER BY order_id DESC LIMIT 1)[OFFSET(0)].*
FROM DATA t
GROUP BY name   

с результатом

Row name    f_date      l_id    f_id    total   _3_order    _3_date     l_date   
1   JONES   2019-01-03  14      11      50      13          2019-06-03  2019-07-03   
2   John    2019-07-23  15      15      10      null        null        2019-07-23  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...