Плоские большие строки запроса - PullRequest
0 голосов
/ 07 ноября 2018

Пожалуйста, помогите мне решить эту задачу. У меня есть таблица Google Big Query, например:

| name | startDate  | endDate    |
| Bob  | 2018-01-01 | 2018-01-01 |
| Nick | 2017-12-29 | 2017-12-31 |

и в результате мне нужно получить что-то вроде этого:

| name  | date       |
| Bob   | 2018-01-01 |
| Nick  | 2017-12-29 |
| Nick  | 2017-12-30 |
| Nick  | 2017-12-31 |

Возможно ли это? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
WITH CTE as (
SELECT 'bob' name, date('2018-01-01') startDate, date('2018-01-01') endDate
UNION ALL SELECT 'Nick', date '2017-12-29' startDate, date('2017-12-31') endDate
),

CTE2 AS (
SELECT name, GENERATE_DATE_ARRAY(startDate, endDate, INTERVAL 1 DAY) AS date
FROM CTE
)

SELECT name, date
FROM CTE2,
UNNEST(date) as date
0 голосов
/ 07 ноября 2018

Или просто

#standardSQL
SELECT name, date
FROM `project.dataset.table`, 
UNNEST(GENERATE_DATE_ARRAY(startDate, endDate)) date
0 голосов
/ 07 ноября 2018

Вы можете использовать таблицу календаря здесь:

WITH dates AS (
    SELECT '2017-12-29' AS date_val UNION ALL
    SELECT '2017-12-30' UNION ALL
    SELECT '2017-12-31' UNION ALL
    SELECT '2018-01-01'
    -- and maybe other dates
)

SELECT
    t2.name,
    t1.date_val
FROM dates t1
INNER JOIN yourTable t2
    ON t1.date_val BETWEEN t2.startDate AND t2.endDate
ORDER BY
    t2.name,
    t1.date_val;

Если ваша версия BigQuery не поддерживает CTE, вы можете просто встроить CTE в качестве подзапроса. То есть замените dates на тело самого CTE.

На практике вам может потребоваться сгенерировать ряд дат (q.v. здесь ) или, возможно, сохранить выделенную таблицу календаря в вашей базе данных. Выше показано, как может выглядеть сам запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...