如何基于 2 列(时间和进程级别)创建索引列

Posted

技术标签:

【中文标题】如何基于 2 列(时间和进程级别)创建索引列【英文标题】:How can I create an Index column based on 2 columns (time and the process level) 【发布时间】:2021-10-07 08:21:51 【问题描述】:

我正在尝试获取 Index 列(以黄色突出显示),该列可以计算产品 ID 迭代 1 - 6 的次数,由 Status Key 表示,并且表格按时间顺序排序。

详细说明:产品 ID 遵循时间戳表示的时间顺序,状态键可以来回波动(这是一种批准或拒绝过程,键表示批准阶段)。我希望每次状态键开始循环 1-6 时索引列计数 +1。起始编号并不总是从 1 开始。

【问题讨论】:

每个部分的底行在 Staus Key 列中是否始终为 6? 这些答案对你有用吗? 【参考方案1】:

您没有明确规定如何检测状态键何时开始增加。但是这种使用List.Generate 的方法应该可以适应,以防我从您的数据中直觉得出的方法不正确。

我在 Status Key = 6 之后开始将计数加一

来源

M 码

let
    Source = Excel.CurrentWorkbook()[Name="Products"][Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,
        "Product ID", Int64.Type, "Date", type datetime, "Status Key", Int64.Type),

//Generate List for Index column
// incrementing after SK = 6
    sk = #"Changed Type"[Status Key],
    IndexList = List.Generate(
        ()=>[Index = 1, idx = 0],
        each [idx] < List.Count(sk),
        each [Index = if sk[idx] = 6 then [Index]+1 else [Index],
                idx=[idx]+1],
        each [Index]
                            ),
//Add Index column to table
    integer = Int64.Type,
    newTble = Table.FromColumns(
                Table.ToColumns(#"Changed Type") & IndexList,
                type table[Product ID = integer, Date = datetime, Status Key = integer, Index = integer]
    )
in
    newTble

结果

【讨论】:

【参考方案2】:

对于 powerquery,这是我的版本,假设您希望在 Status Key = 6 之后开始将计数加一。这可能更容易理解

添加索引

使用公式添加自定义列

= if [Status Key]=6 then [Index] else null

右键单击该自定义列并填写

单击选择产品 ID 和新的自定义列,然后选择分组依据。使用您想要的任何名称并操作所有行

添加另一个索引

扩展组创建的数据列以提取数据和状态键字段

删除多余的列

let Source = Excel.CurrentWorkbook()[Name="Table1"][Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each if [Status Key]=6 then [Index] else null),
#"Filled Up" = Table.FillUp(#"Added Custom","Custom"),
#"Grouped Rows" = Table.Group(#"Filled Up", "Product ID", "Custom", "data", each _, type table),
#"Added Index1" = Table.AddIndexColumn(#"Grouped Rows", "Index", 1, 1),
#"Expanded data" = Table.ExpandTableColumn(#"Added Index1", "data", "Date", "Status Key", "Date", "Status Key"),
#"Removed Columns" = Table.RemoveColumns(#"Expanded data","Custom")
in  #"Removed Columns"

【讨论】:

如果增量是在Status Key = 6 之后开始的,这也有效,并且添加初始Index 列有助于避免Table.Group 的潜在问题(我只读过)并不总是以原始顺序返回数据(特别是如果它之前已排序)。

以上是关于如何基于 2 列(时间和进程级别)创建索引列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL索引的创建和删除

Oracle 索引

了解 EXPLAIN 以创建基于列的索引

主键和索引的区别

索引创建的原则

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引