Как я могу создать столбец с количеством месяцев, прошедших с момента присоединения пользователя (первая дата для каждого идентификатора), и сгруппировать все идентификаторы, которые присоединились в этом месяце в SQL?

#sql #snowflake-cloud-data-platform

Вопрос:

Вот еще несколько деталей, так как немного сложно четко задать этот вопрос в предложении:

В принципе, у меня есть таблица с некоторыми из следующих полей:

 | ID       | date                 | start_date            | amount_paid | last_amount_paid | field      |
| -------- | ---------------------| ----------------------| ----------- | ---------------- | ---------- |
| ID_00001 | 2020-08-01 00:00:00  | 2019-11-06 20:23:36   | 0           |  0               | cosmetics  |
| ID_00002 | 2020-08-02 00:00:00  | 2018-10-06 10:34:21   | 10          |  0               | finance    |
| ...      | ...                  | ...                   | ...         |  ...             | ...        |
| ID_99999 | 2021-11-06 00:00:00  | 2020-08-01 11:54:47   | 15          |  10              | software   |
 

Я хочу добавить столбец «месяцы», который подсчитывает количество месяцев между датой начала и датой для каждого идентификатора, например:

 | ID       | date                 | start_date            | ...  | months     |
| -------- | ---------------------| ----------------------| ---- | ---------- |
| ID_00001 | 2020-08-01 00:00:00  | 2019-11-06 20:23:36   | ...  |  9         |
| ID_00002 | 2020-08-02 00:00:00  | 2018-10-06 10:34:21   | ...  |  22        |
| ...      | ...                  | ...                   | ...  |  ...       |
| ID_99999 | 2021-11-06 00:00:00  | 2020-08-01 11:54:47   | ...  |  15        |
 

Затем я хочу сгруппировать все идентификаторы, которые начали (первая дата начала) одновременно (т. Е. Я хочу сгруппировать пользователей по количеству месяцев).

Мне трудно сосредоточиться на том, чтобы сделать это с помощью SnowflakeSQL.

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

Очень признателен!

Ответ №1:

Использование вычисленного/сгенерированного столбца и файла ДАТЫ:

 CREATE OR REPLACE TABLE t(id TEXT,
                          date DATE,
                          start_date DATE,
                          months INT AS  (DATEDIFF(MONTH, start_date, date))
                         );
 

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

 INSERT INTO t(id, date, start_date)
SELECT  'ID_00001',  '2020-08-01 00:00:00', '2019-11-06 20:23:36'
UNION SELECT  'ID_00002', '2020-08-02 00:00:00', '2018-10-06 10:34:21';

SELECT * FROM t;
 

Выход:

введите описание изображения здесь


Настороженно оборачивающий стол с видом:

 CREATE VIEW t_vw
AS
SELECT t.id, t.start_date, t.date, DATEDIFF(MONTH, start_date, date) AS months
FROM t;