powershell - Powershell:滞后函数优于属性
问题描述
大家好,
我正在寻找是否有可能实现滞后功能 - 无需遍历整个列表,例如,查看以下示例:
$input = '[
{ "user_id":"1", "earned":"100", "valid_at": "20200101"},
{ "user_id":"1", "earned":"200", "valid_at": "20200102"},
{ "user_id":"1", "earned":"10", "valid_at": "20200103"},
{ "user_id":"2", "earned":"10", "valid_at": "20200101"},
{ "user_id":"2", "earned":"40", "valid_at": "20200103"},
{ "user_id":"3", "earned":"400", "valid_at": "20200101"},
{ "user_id":"3", "earned": null, "valid_at": "20200102"},
{ "user_id":"3", "earned": "20", "valid_at": "20200103"}
]'
$expected_output = '[
{ "user_id":"1", "earned":"100", "valid_at": "20200101", "last_earned":null},
{ "user_id":"1", "earned":"200", "valid_at": "20200102", "last_earned":"100"},
{ "user_id":"1", "earned":"10", "valid_at": "20200103", "last_earned":"200"},
{ "user_id":"2", "earned":"10", "valid_at": "20200101", "last_earned":null},
{ "user_id":"2", "earned":"40", "valid_at": "20200103", "last_earned":"10"},
{ "user_id":"3", "earned":"400", "valid_at": "20200101", "last_earned":null},
{ "user_id":"3", "earned": null, "valid_at": "20200102", "last_earned":"400"},
{ "user_id":"3", "earned": "20", "valid_at": "20200103", "last_earned":null}
]'
$json_input = ConvertFrom-Json –InputObject $input
$expected_json_output = ConvertFrom-Json –InputObject $expected_output
这将创建以下输入:
连同以下预期输出:
现在我的问题是:
- 有没有办法以编程方式构建last_earned列,而不必遍历整个列表(即,以某种方式使用 Group-Object 或 Where-Object?
- 目前,我正在遍历整个列表 - 但必须快速意识到,虽然它按预期工作,但如果你有很多记录来计算它,效率会非常低
- 我目前正在为每个单独的user_id单独计算这个(即,
- 选择它,
- 排序结果,然后
- 检查最后赚取的
解决方案
假设输入已经排序,您可以通过使用哈希表跟踪每个用户 id 的最后一次看到的值来一次性完成此操作:
$last = @{}
$json_input |Select-Object *,@{Name='earned_day_before';Expression={$last[$_.user_id];$last[$_.user_id]=$_.earned}}
如果没有,您可以先按用户 ID 对所有记录进行排序,然后按日期排序:
$last = @{}
$json_input |Sort-Object user_id,valid_at |Select-Object *,@{Name='earned_day_before';Expression={$last[$_.user_id];$last[$_.user_id]=$_.earned}}
推荐阅读
- css - 如何更改 Google Charts 类别过滤器中下拉框的高度
- sql - CASE 表达式总和 - 加入其他表时的问题
- elasticsearch - Elasticsearch 节点崩溃
- oracle - 使同一表中 2 列中的值相互唯一
- php - 如何在php中正确转义数组?
- azure - 如何查看日志分析工作区中表的行数?
- reactjs - 无法解析“../../theme.config”
- combobox - 如何在后面的代码中访问 ComboBox 选定项
- javascript - Ajax 下载 gzip 文件 - 响应数据始终为字符串
- weblogic - cfgfwk-64254 在创建新域时执行安全处理阶段出错