使用 T-SQL、DAX 或 M Query 在值更改后创建 StartDate 和 EndDate 列

Posted

技术标签:

【中文标题】使用 T-SQL、DAX 或 M Query 在值更改后创建 StartDate 和 EndDate 列【英文标题】:Create a StartDate and EndDate column after value change using either T-SQL, DAX or M Query 【发布时间】:2021-11-02 00:08:29 【问题描述】:

我有一张如下表:

日期/名称/旧值/新值

我想要一种使用以下任何方法创建开始日期和结束日期列的方法:DAX、T-SQL 或 M Query。

意义; StartDate 是 [Date],End the date 是同一个人更改值的日期。

提前致谢。

【问题讨论】:

根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 这能回答你的问题吗? Is there a way to access the "previous row" value in a SELECT statement? 我做了更改@DaleK 这对我不起作用@Charlieface 【参考方案1】:

使用 Power Query M,您可以按照以下步骤操作:

在我的演示数据中,列的排序正确,但您可以使用此代码来确保它们是:

#"Sort Table" = Table.Sort(#"Changed Type","Name", Order.Ascending, "Date", Order.Ascending)

添加索引列 > 添加列 > 索引列 > 从 0 开始(必须从 0 开始)

添加列>自定义列>名称结束日期>

if [Name] <> #"Added Index" [Name] [Index] + 1 then null else Date.AddDays(#"Added Index" [Date] [Index] + 1,-1)

右键单击结束日期 > 替换错误 > 替换为 null

根据需要调整列顺序

将新值列重命名为“值”,将日期列重命名为“开始日期”。删除不需要的列

来源和输出:

编辑:我应该补充一点,这在小型数据集上可以正常工作,但在较大的数据集上,您可能会遇到性能问题。在这种情况下,您应该复制查询,为一个查询添加一个从 0 开始的索引,并在另一个查询中从 1 开始一个索引。然后您可以将两者合并在一起以提取必要的日期和值。

【讨论】:

我确实遇到了性能问题。但是复制查询将如何解决呢?它只会做同样的事情两次!

以上是关于使用 T-SQL、DAX 或 M Query 在值更改后创建 StartDate 和 EndDate 列的主要内容,如果未能解决你的问题,请参考以下文章

Dax vs M(power query)表组合大表的最佳实践

在 DAX 或 Power Query 中自引用列

T-SQL:如何在值列表中选择不在表中的值?

带有加号或减号的 DAX 数字格式

如何在值列中搜索特定值并在 Big Query SQL 中替换为该特定值?

为啥dax=adx?