klipfolio - 在klipfolio中从json中分组多个日期
问题描述
我有一个 JSON 格式的输入,格式如下:
[
{
"hash":"abcdefg",
"Stage 1 Status":"Complete",
"Stage 1 Completion":"2021-01-16T19:56:10+02:00",
"Stage 2 Status":"Complete",
"Stage 2 Completion":"2021-02-17T16:30:30+03:00",
"Stage 3 Status":"Complete",
"Stage 3 Completion":"2021-03-17T16:30:34+03:00"
},
{
"hash":"klmnop",
"Stage 1 Status":"Complete",
"Stage 1 Completion":"2021-01-16T19:56:10+02:00",
"Stage 2 Status":"Open",
"Stage 2 Completion":"2021-02-17T16:30:34+03:00"
},
{
"hash":"jklmn",
"Stage 1 Status":"Complete",
"Stage 1 Completion":"2021-01-16T19:56:10+02:00",
"Stage 2 Status":"Lost",
"Stage 2 Completion":"2021-07-17T16:30:30+03:00"
}
]
我想在 klifolio 中制作一个 klip,向我展示每个月的已完成阶段,就像从上述数据得出的以下输出一样。
一月 | 二月 | 行进 | |
---|---|---|---|
阶段1 | 3 | 0 | 0 |
第二阶段 | 0 | 1 | 0 |
第三阶段 | 0 | 0 | 1 |
数据是三年的,我需要在单独的表格中显示年数。klipfolio 的新手,所以到目前为止,我已经为表格列标题和行标签构建了数组,但我在查询时遇到了困难。
解决方案
要在 Klipfolio 中完成此操作,您需要首先将 JSON 数据组织成柱状结构,以便对其执行查询。为此,您需要一组用于状态、完成和阶段名称的数据。
默认情况下,kf:names 按字母顺序返回数据,FALSE 参数按 JSON 结构从上到下的顺序返回数据。
LEFT() 将返回最左边的 7 个字符,它只会返回“Stage 1”而不是“Stage 1 Status”
要返回日期,需要通配符选择器以及 contains() 函数来返回名称为 contains “Completion”的字段的任何值。
@/*[contains(name(),'Completion')]
最后,要返回状态,您需要执行与上述相同的操作,但搜索包含“状态”的字段名称。
@/*[contains(name(),'Status')]
从这里你应该有 3 个可以查询的数据数组。返回 JSON 结构中所有字段名称的第一个查询首先需要过滤以返回与日期和状态数组相同数量的项目。您可以使用SELECT()仅返回具有“完成”或“状态”的字段,因为我们知道这些字段与值之间存在一对一的关系。
SELECT(LEFT(@kf:names(/,FALSE),7),CONTAINS(@kf:names(/,FALSE),"Status"))
这将返回 7 项以匹配 7 项日期和状态。
现在数据的形状正确,可以使用 SELECT()、 AND()、GROUP()和COUNTDISTINCT()函数在每列中使用LOOKUP()来对齐每个阶段已完成记录的计数。
首先,结果在 LOOKUP() 的第一个参数中引用具有阶段名称的列。然后使用 SELECT() 筛选仅属于特定月份的已完成阶段。对于日期,您需要使用 DATE() 转换为 unix 时间,然后使用 DATEVALUE() 转换为汇总为一个月的内容,例如“yyyyMM”格式,如果日期在一月,则返回“202101”今年的。
SELECT() 看起来像这样:
SELECT(SELECT(LEFT(@kf:names(/,FALSE),7),CONTAINS(@kf:names(/,FALSE),"Status")),AND(DATEVALUE(DATE(@/*[contains(name(),'Completion')],"yyyy-MM-dd"),"yyyyMM")="202101",@/*[contains(name(),'Status')]="Complete"))
在第二个参数中,将 GROUP() 包裹在 SELECT() 周围以对类似的值进行分组,并在 LOOKUP() 的第三个参数中将 SELECT() 与 COUNTDISTINCT() 包裹起来以计算每组的项目。2021 年 1 月列的整个公式如下所示:
LOOKUP(&Stages,GROUP(SELECT( SELECT(LEFT(@kf:names(/,FALSE),7),CONTAINS(@kf:names(/,FALSE),"Status")), AND(DATEVALUE(DATE(@/*[contains(name(),'Completion')],"yyyy-MM-dd"),"yyyyMM")="202101", @/*[contains(name(),'Status')]="Complete"))), COUNTDISTINCT(SELECT( SELECT(LEFT(@kf:names(/,FALSE),7),CONTAINS(@kf:names(/,FALSE),"Status")), AND(DATEVALUE(DATE(@/*[contains(name(),'Completion')],"yyyy-MM-dd"),"yyyyMM")="202101", @/*[contains(name(),'Status')]="Complete"))))
从那里,您可以将公式中的 202101 更改为任何 yyyyMM 以返回特定月份数据 IE。对于下一列,2 月将是 202102。
推荐阅读
- javascript - 如何通过像运行普通节点一样运行 index.js 文件来运行 yeoman 生成器
- multithreading - QueueUtil 为 MessageHandlers 产生了太多线程,异步/等待问题
- python - 如何将嵌套函数代码转换为可读的布尔代数?
- javascript - 在反应测试渲染器中调用道具回调不会更新钩子
- python - 高斯未定义
- c# - 如何将标签页、列表框加载到标签页以及将复选框加载到具有特定名称和位置的列表框
- mysql - 我的 SQL 尝试使用事务和锁定
- wordpress - Recaptcha 版本 3 不适用于联系表 7
- android - Android PopupMenu 卡顿+双重渲染
- mysql - SQL - 在另一个表中选择不存在的行