Мой рабочий пример / образец Google Sheet: https://docs.google.com/spreadsheets/d/1AvAb_qnrrexYl5W5wAW6aA6P552T-prBxoONOis-XZM/edit?usp=sharing
У меня есть исходная таблица с информацией о билетах. Ради этого вопроса есть только три столбца, которые имеют значение:
- Идентификатор билета
- Дата открытия билета
- Дата закрытия билета - если он закрыт
Из этой информации мне нужно сгенерировать метрики / отчеты, которые показывают для определенного c месяца:
- Тикеты, которые были открыты в этом месяце
- Билеты, которые были закрыты в этом месяце
- Билеты, которые были открыты (открыт до и не закрыты)
И мне нужны необработанные данные, а не только ежемесячная сводка , Это значит, что я должен иметь возможность выбрать месяц и показать все идентификаторы билетов, соответствующие вышеуказанным трем критериям.
Получить первые два достаточно просто, используя эту функцию (столбцы EG в моем примере):
{
QUERY(A2:C, "SELECT B, 'Opened', A WHERE A IS NOT NULL LABEL 'Opened' '' FORMAT B 'YYYY-MM'");
QUERY(A2:C, "SELECT C, 'Closed', A WHERE C IS NOT NULL LABEL 'Closed' '' FORMAT C 'YYYY-MM'")
}
Я застрял на третьем. Я пытаюсь понять, как каждый месяц открывать билет. Для каждого месяца, в котором открыт билет, должна быть одна строка, в которой:
- Первый столбец - месяц
- Второй столбец - «Открыть»
- Третий столбец - это ID билета
Например:
- ID0010
- , открытый в 2018-11
- закрыто в 2019-01
- открыто в:
- ID0019
- открыто в 2018-08
- закрыто в 2019-03
- открыто в:
- 2018-09
- 2018-10
- 2018-11
- 2018-12
- 2019-01
- 2019-02
станет:
| Month | Status | Ticket ID |
|---------|--------|-----------|
| 2018-11 | Opened | ID0010 |
| 2018-12 | Open | ID0010 |
| 2019-01 | Closed | ID0010 |
| 2018-08 | Opened | ID0019 |
| 2018-09 | Open | ID0019 |
| 2018-10 | Open | ID0019 |
| 2018-11 | Open | ID0019 |
| 2018-12 | Open | ID0019 |
| 2019-01 | Open | ID0019 |
| 2019-02 | Open | ID0019 |
| 2019-03 | Closed | ID0019 |
Примечание: месяц, в котором билет был открыт и закрыт, также не будет отображаться «Открыть» за билет. Другими словами, билет должен иметь только «Открыто» в месяцы:
- После и не включая открытое
- До и не включая закрытое
И, если билет еще не закрыт, то он будет по одной строке для каждого месяца до сегодняшнего дня.
Я подумал, что мог бы использовать концепцию в принятом решении для Формула Google Sheets для вычисления фактической общей продолжительности задачи с разными датами начала / окончания, перекрытиями и пробелами , но из-за размера данных я получаю сообщение об ошибке. Формула приведена в I2 моего образца.
Текстовый результат CONCATENATE длиннее, чем ограничение в 50000 символов.
Так что мне интересно, есть ли еще как я мог получить данные, которые мне нужны. Я знаю, как сделать это с пользовательской функцией, но я надеюсь избежать пользовательской функции, если это возможно.
обновление с решением
Я смог взять ключевые части player0 ответ и используйте его в моем первоначальном решении. Суть в том, что вместо использования CONCATENATE
для объединения столбцов / строк используйте QUERY
с 999^99
в качестве счетчика заголовков (3-й параметр), потому что QUERY
тогда объединит все строки (с разделителем пробелов) ).
Окончательная формула:
=ARRAYFORMULA(
QUERY(
SPLIT(
TRANSPOSE(
SPLIT(
QUERY(
TRANSPOSE(
TRIM(
QUERY(
IF(
A2:A <> "",
A2:A & "," & EDATE(
IFERROR(
SPLIT(
REPT(
EOMONTH(B2:B, -1) + 1 & ",",
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
)
),
","
),
0
),
TRANSPOSE(
ROW(
INDIRECT(
"A1:A" & MAX(
IF(
B2:B <> "",
IFERROR(
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
),
0
),
)
)
)
)
)
) & ";",
),
,
999^99
)
)
),
,
999^99
) & " ",
"; "
)
),
","
),
"SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
0
)
)
обновление для использования SEQUENCE
=ARRAYFORMULA(
QUERY(
SPLIT(
TRANSPOSE(
SPLIT(
QUERY(
TRANSPOSE(
TRIM(
QUERY(
IF(
A2:A <> "",
A2:A & "," & EDATE(
IFERROR(
SPLIT(
REPT(
EOMONTH(B2:B, -1) + 1 & ",",
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
)
),
","
),
0
),
SEQUENCE(
1,
MAX(
IF(
B2:B <> "",
IFERROR(
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
),
0
),
)
)
)
) & ";",
),
,
999^99
)
)
),
,
999^99
) & " ",
"; "
)
),
","
),
"SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
0
)
)