快速提示:在单次幂查询函数中将十六进制,十进制和二进制转换为十进制

强大的查询功能,可将HEX,OCT和BIN值转换为DEC

前一段时间我写了一篇关于如何使用的博客文章 Power 双 中的Unicode字符。在该博文中,我使用了递归Power Query函数将十六进制值转换为Dec值。几周前,我的一位访问者好心地分享了 他的Power Query函数的非递归版本 做得很好。大声喊着 罗科·卢波(Rocco Lupoi) 共享他的代码。因此,我决定与所有人共享它,以便更多的人可以利用他出色的Power Query功能。虽然我已经触及了他的代码,但这只是表面上的变化,因此本博文的所有功劳归Rocco所有。他的代码的好处不仅限于非递归。 下面的代码在基数小于16时(例如Binary和Oct)转换任何基数的数字,因此它是 仅限于 十六进制 价值观 只要 。以下代码的另一个好处是它不区分大小写(请注意 digits 踩下面的代码)。

这里是 fnHex2Dec 电源查询功能:

(input as text, optional base as number) as number =>
let
         价值观  = [
                0=0,
                1=1,
                2=2,
                3=3,
                4=4,
                5=5,
                6=6,
                7=7,
                8=8,
                9=9,
                A=10,
                B=11,
                C=12,
                D=13,
                E=14,
                F=15
        ],
        digits = Text.ToList(Text.Upper(input)),
        dim = List.Count(digits)-1,
        exp = if base=null then 16 else base,
        Result = List.Sum(
                        List.Transform(
                                {0..dim}
                                , each Record.Field(values, digits{_}) * Number.Power(exp, dim - _)
                                )
                        )
in
        Result

As you see in the code above, the base parameter is optional, so if 不 provided base 16 would be the default.

这就是我们可以调用上面的函数的方式:

  fnHex2Dec  ("AbCdEf", null)
调用fnHex2Dec函数将任意基数转换为十进制
继续阅读 “快速提示:在单次幂查询函数中将十六进制,十进制和二进制转换为十进制”

快速提示 : 时间 Dimension with 时间 Bands at Seconds Granularity in Power 双 和 SSAS 表格

时间 Dimension with 时间 Bands at Seconds Granularity in  Power  双    和   SSAS 表格

过去我也写过其他有关此主题的文章,您可以找到它们 这里 这里 。在第一篇文章中,我解释了如何创建“Time”时间带的维度 分钟 粒度。然后,我的一位客户要求“Time”几秒钟内的尺寸,这鼓励了我写第二篇博客文章。在第二篇博文中,虽然我没有’t做时间带,所以我在这里写第三篇文章,这是第二篇文章支持5分钟,15分钟,30分钟,45分钟和60分钟的时间带的变体。“Time”尺寸降至秒。在这篇快速文章中,我直接跳到重点,向您展示如何生成“Time”维度以三种不同的方式,即在SQL Server中使用T-SQL,使用Power Query(M)和DAX。然后是这里:

时间 Dimension at Second Grain with 功率查询 (M) Supporting 时间 Bands:

在查询编辑器中复制/粘贴以下代码’s Advanced Editor to generate 时间 dimension in 功率查询:

let
Source = Table.FromList({1..86400}, Splitter.SplitByNothing()),
    #"Renamed Columns" = Table.RenameColumns(Source,{{"Column1", "ID"}}),
    #"时间 Column Added" = Table.AddColumn(#"Renamed Columns", "时间", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0,0,0,[ID]))),
    #"Hour Added" = Table.AddColumn(#"时间 Column Added", "Hour", each 时间.Hour([Time])),
    #"Minute Added" = Table.AddColumn(#"Hour Added", "Minute", each 时间.Minute([Time])),
    #"5 Min Band Added" = Table.AddColumn(#"Minute Added", "5 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0, 0, Number.RoundDown(Time.Minute([Time])/5) * 5, 0))  +   #duration (0, 0, 5, 0)),
    #"15 Min Band Added" = Table.AddColumn(#"5 Min Band Added", "15 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0, 0, Number.RoundDown(Time.Minute([Time])/15) * 15, 0))  +   #duration (0, 0, 15, 0)),
    #"30 Min Band Added" = Table.AddColumn(#"15 Min Band Added", "30 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0, 0, Number.RoundDown(Time.Minute([Time])/30) * 30, 0))  +   #duration (0, 0, 30, 0)),
    #"45 Min Band Added" = Table.AddColumn(#"30 Min Band Added", "45 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0, 0, Number.RoundDown(Time.Minute([Time])/45) * 45, 0))  +   #duration (0, 0, 45, 0)),
    #"60 Min Band Added" = Table.AddColumn(#"45 Min Band Added", "60 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) +  #duration (0, 0, Number.RoundDown(Time.Minute([Time])/60) * 60, 0))  +   #duration (0, 0, 60, 0)),
    #"Removed Other Columns" = Table.SelectColumns(#"60 Min Band Added",{"时间", "Hour", "Minute", "5 Min Band", "15 Min Band", "30 Min Band", "45 Min Band", "60 Min Band"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"时间", type time}, {"Hour", Int64.Type}, {"Minute", Int64.Type}, {"5 Min Band", type time}, {"15 Min Band", type time}, {"30 Min Band", type time}, {"45 Min Band", type time}, {"60 Min Band", type time}})
in
#"Changed Type"
继续阅读 “Quick Tips: 时间 Dimension with 时间 Bands at Seconds Granularity in Power 双 和 SSAS 表格”

Power 双 治理,良好实践,第2部分:使用OneDrive,团队和SharePoint Online进行版本控制

 Power  双  治理,商业用OneDrive,Microsoft Teams和SharePoint Online的版本控制

软件开发生命周期中最重要的方面之一是控制解决方案的不同版本,尤其是在一个项目中,有多个开发人员参与实施的项目中。就像通常在Visual Studio中创建项目并将更改提交回GitHub或Azure DevOps之类的源代码控制系统一样,’建议保留Power 双 报告不同版本的历史记录。我们对源代码控制解决方案的期望是,在开发项目时始终跟踪源代码中发生的所有更改。因此,您可以根据需要轻松地回滚到以前的状态。 

拥有源代码控制流程的另一个好处是,当多个开发人员在一个项目上工作时。它们中的每一个都对源代码进行更改,然后将所有更改提交到源代码控制服务器中,而不会相互覆盖’ work. 

但是使用Power 双 会有些不同。 Power 双 报告文件是以二进制格式存储的PBIX文件(嗯,PBIX基本上是一个zip文件吗?),在撰写本文时,尚无官方方法来实施Power 双 源代码控制 在任何源代码控制解决方案中,如GitHub或Azure DevOps(YET)。 

微软上周(6/05/2020)宣布了一项名为“部署管道”的功能完全可以满足我们的需求,但目前是预览功能,仅适用于具有Power 双 Premium的组织。因此,对于我们大多数人来说,这是不可行的。

话虽如此,仍然存在一种方法来保留PBIX文件不同版本的形状变化的历史记录。这就是所谓的 版本控制.

开发报告时,有几种方法可以启用对PBIX文件的版本控制。无论版本控制平台是什么,您都需要考虑拥有多个环境以及谁可以访问它们以执行操作。

环境可访问描述
发展历程 开发者 数据建模人员和报表编写者出于开发目的而访问此环境。 
用户验收测试 (UAT) 开发人员,中小企业,技术主管,Power 双 管理员开发完成后,开发人员将解决方案部署到UAT环境。然后,该解决方案将由SME(主题专家)进行测试,以确保满足业务要求。
预生产 (可选,但推荐) Power 双 管理员技术主管解决方案通过所有UAT测试方案后,技术主管或Power 双 管理员将其部署到Pro-prod中进行最终检查,以确保所有数据源正确指向生产数据源,并且所有报告和仪表板均按预期工作。 
生产技术主管,Power 双 管理员,最终用户产品前检查完成后,技术主管或Power 双 管理员将解决方案部署到生产环境中,然后供最终用户使用。

版本控制选项

如果您的组织没有高级能力,则“Deployment Pipelines”该功能对您不可用。因此,您需要提出一个解决方案。在本节中,我列出了一些可用的版本控制选项

  • 商业用OneDrive
  • 微软团队 / 的SharePoint在线
继续阅读 “Power 双 治理,良好实践,第2部分:使用OneDrive,团队和SharePoint Online进行版本控制”

介绍Power 双 治理和采用良好实践系列

 Power  双  治理系列介绍

根据我从2000年初开始在IT行业工作的经验,数据治理一直是非常重视的一个方面。

多年以来,行业一直了解到有一套适当的数据治理流程来确保数据安全健康的重要性,这样才能充分利用数据。 Power 双 与其他任何数据平台都没有什么不同,因此数据治理是其中的重要组成部分。但是,自助服务数据管理的概念提供了所有优点,并提供了一种敏捷方法,导致一些组织从一开始就不考虑其治理方法。

另一方面,有些人认为治理是负担,减缓了采用速度。有些人认为更糟,他们认为治理是一个障碍,使很多不必要的限制到位,从而降低了效率。

但是实际上,如果您迟早开始进行数据治理规划,则可以保护组织免受大量风险的侵害,而这些风险会变得非常讨厌和昂贵,例如:

  • 由于数据泄漏和隐私问题而引起的诉讼风险
  • 由于数据质量差而进行的不可信数据分析和报告
  • 由于缺乏审计而使解决方案表现不佳
  • 不确定的环境导致开发效率低下
缺乏治理的风险
继续阅读 “介绍Power 双 治理和采用良好实践系列”