飞天篮球

边齐
第 3 位会员
注册于 2018-08-08 14:57:03
活跃于 2020-04-01 16:24:24


  • 城市
  • 如何利用大写的首字母来拆分 M 语言函数 at 2018-11-05 18:12:44

    或者也可以在PBID中使用Python正则...\p{Lu}表示大写字母,(?=\p{Lu})表示顺序环视,查找到后边紧跟大写字母的位置

    = Python.Execute("import regex as re
    df=pandas.DataFrame([re.split(r'(?V1)(?=\p{Lu})','CombineTextByEachDelimiter')[1:]])
    ")

    file

  • 如何利用大写的首字母来拆分 M 语言函数 at 2018-11-05 17:51:32

    fyi

    可以试试Splitter类函数,具体用法请参考施阳大神的文章:https://pqfans.com/1529.html

    Splitter.SplitTextByPositions(Text.PositionOfAny(“文本”,{"A".."Z"},2))(“文本”)

  • 【叼钻!慎入!】PQ、DAX 怎样实现这种日期分组汇总? at 2018-11-01 12:14:45

    @回头便知
    老夫晚生后学,承蒙畅神不弃,引路入门(M)。

    所谓处处留心皆学问......从你最近的两个案例中我也学到了不少。以下是我整理的笔记,供参考学习,感谢提及的各位!!

    file

  • 【叼钻!慎入!】PQ、DAX 怎样实现这种日期分组汇总? at 2018-11-01 10:43:37

    @回头便知

    最优解自然是木木老师的DAX解法。

    M在加载大数据到表的时候确实很慢。IMHO:

    1、ntt的List.Accumulate写法挺好。最后一步没有实现动态扩展,这只是个小问题,改一下就好;

    2、小信的写法没有考虑全面,比如上市之后头七天或者当中的某七天没有成交额,输出结果就跟你说的不一样了。
    当然,他的动态扩展列用List.Union(List.Transform(分组[a],Table.ColumnNames)),写法更简洁,值得学习。

    Abv fyi!

  • 【叼钻!慎入!】PQ、DAX 怎样实现这种日期分组汇总? at 2018-10-30 13:30:38

    PQ解法,常规思路,供参考!
    把代码中的“T = #table(n,{m[b]})”这部分写成“T = #table(n,{D,m[b]})”可以观察到具体的哪些7天。

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], 
        更改 = Table.TransformColumnTypes(源,{{"上市日期", type date}, {"销售日期", type date}}),
        分组 = Table.Group(更改, "产品编号", {"a", (z)=>[ m = Table.Group( Table.Buffer(Table.Sort(Table.Combine({z,
                                                                                                                 #table({"销售日期"},
                                                                                                                        List.Generate( ()=>z[上市日期]{0},
                                                                                                                                       each _<=List.Max(z[销售日期]),
                                                                                                                                       each Date.AddDays(_,1),
                                                                                                                                       each {_})
                                                                                                                         ) } ),
                                                                                                  "销售日期" ) ),
                                                                          "销售日期",
                                                                         {"b",each List.Sum([成交金额])},
                                                                          0,
                                                                         (x,y)=>Number.From(Date.AddDays(x,7)<=y) ),
                                                        D = List.Transform(m[销售日期],each Text.Format("#{0}-#{1}",{_,Date.AddDays(_,6)})),
                                                        n = List.Transform({1..List.Count(m[b])},each Number.ToText(_,"第0个7天")),
                                                        T = #table(n,{m[b]})]
                                                        [T]
                                            },1),
        展开 = Table.ExpandTableColumn(分组, "a", List.Max( List.Transform(分组[a],each {Table.ColumnNames(_),Table.ColumnCount(_)}),
                                                           null,
                                                           each _{1}){0} )
    in
        展开
  • 【Excel 传统函数搞死人】怎么实现多条件订单数的统计? at 2018-10-27 13:07:53

    @回头便知
    供参考!
    大概1448种不同商品的两两组合所生成的表的行数几乎能到excel的最大行数104万8千行,这个运算量是很大的。
    还有一点,你说的“不能运算成功”不知道是不是这个问题:在excel里做DAX查询,是不能带有var定义变量的,否则在后续刷新的时候excel就会进入未响应状态,原因未知。可以把所有VAR嵌套到最后的公式里,这样刷新的时候就不会不响应了。DAX查询对1448种商品生成笛卡尔积的速度还是能接受的,2G内存的电脑在1分钟之内,有时候刷新数据excel会自动退出。

  • 【Excel 传统函数搞死人】怎么实现多条件订单数的统计? at 2018-10-23 15:14:46

    供参考:

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
         T = [ g1 = Table.ToRows(Table.Group(源, "商品代码", {"c", each Table.RowCount(_)})),
               g2 = Table.Group(源, "订单号", {"a", each [商品代码]})[a],
                r = #table( {"商品A","商品B","包含A","包含B","A+B","总单数"},
                            List.TransformMany( {1..List.Count(g1)},
                                                each List.Skip(g1,_),
                                                (x,y)=>let l=List.Zip({g1{x-1},y}) 
                                                        in List.Combine(l)&
                                                           List.Transform({List.Select(g2,(m)=>List.ContainsAll(m,l{0})),g2},List.Count)
                                             )
                           ) ] [r]
    in
        T
  • 当 powerquery 遇上受保护的视图? at 2018-09-27 16:44:43

    @Alex
    如果是这样的话,可以换成vbs批量打开保存,这个效率貌似要高一些。之前的代码文件找不到了,将就着看看图吧。

    file

  • 如何通过条件判断(对相对位置行列值的比较)构建自定义规则的索引列? at 2018-09-24 20:24:21

    @史努比

    这个一时半会儿也解释不清楚,看你有心就随便聊几句吧。请看后边的注释:

    1. 分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),
    这里 each _ 是函数返回类型的意思吗?
    这部分的意思是分组后生成的表,下划线_表示分组后f列中的每一个table,f可以随意命名,好区分就行。下划线可以进一步处理,本案例中不需要

    后面第四个参数=0,代表什么意思呢?
    第五个参数是一个函数,x和y两个变量输入后,得到x和y相等时的值——但x和y是谁呢?如何输入的?相等后又如何赋值呢?
    第四参数0表示局部分组,第五参数表示的是用什么样的条件来进行分组。本案例中,x表示“功能亮点”这一列分组依据中的第一个值,其它的值都视作y,然后以x=y为标准去判断,如果true就截断,然后重新开始xy判断截取...。这个一开始有点不怎好理解,自己要多比划比划,具体可以参考畅心大神关于局部分组的原创文章:https://pqfans.com/836.html

    2. 添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
    这段我理解是添加一个索引列。我尝试比较了 分组[[f]]和 分组[f]的两种写法,前者是分组这个表格,后者是一个list。 为什么表达一个table的方法是 分组[[f]],而不是分组[f]呢?两层中括号嵌套的用法,是官方的表达式吗?
    [[]]这样的写法是深化表格中某一列为表格的一种方法,常规的 表[列] 这样的写法是把表中的列深化成list。而 表[[列]] 这样的写法是把表中的列依然深化成一个表,你也可以深化出其中的多列,比如,表[[列1],[列2],...],意思就是留下了表中需要的部分,跟Table.SelectColumns、Table.RemoveColumns差不多的效果,只是写法比较撩骚。这种深化方法同样适用于record,你可以自己写个record,然后 record[[field]] 或者 record[[field1],[field2],...]。至于是不是官方写法我也不知道,我是从畅心大神那里学来的。

    就说这么多吧,纸上得来终觉浅,日后有案例可以再交流。

  • 如何通过条件判断(对相对位置行列值的比较)构建自定义规则的索引列? at 2018-09-24 15:19:26
    Solution 1: Table.Group
    
    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],              
       分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),  
       添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
       展开 = Table.ExpandTableColumn(添加索引, "f", {"功能亮点"})
    in   
       展开
    
    ++++++++++++++++++++++cut-off line+++++++++++++++++++++++
    
    Solution 2: List.Accumulate
    
    let
    
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    结果 = #table({"功能亮点","新序列"},
                                   List.Skip(List.Accumulate(源[功能亮点],
                                                                {{"",0}},
                                                                 (s,c)=>if c="智洁技术"
                                                                        then s&{{c,List.Last(s){1}+1}}
                                                                        else s&{{c,List.Last(s){1}}})
                                              )
                 )
    in
    
    结果
  • 如何利用 POWER QUERY 制作简易标签 at 2018-09-14 20:04:54

    @xiaoni
    "?"的作用是下标越界容错,结果变成null 。
    比如一个list {1,2}只有两个值 ,然后我们进行这样的深化取该list中第三个值时"= {1,2}{2} "会报错,
    因为list中只有两个值,但是容错之后"={1,2}{2}?"结果就是null;
    这个也同样适用于record,比如“= [a=1,b=2][c]?”结果是null。record中没有field "c","?"越界容错;
    你也可以试试table深化,比如,一个空表“= #table({},{})”,深化其第一行“= #table({},{}){0}”,就会出错,
    因为是空表,没有值。但容错之后就是null,"= #table({},{}){0}?"。
    大概就是这个意思。

  • 多列转转置 at 2018-09-12 18:05:13

    let
    源 = Excel.Workbook(File.Contents(文件路径), true, true){[Name="样式1"]}[Data],
    变形 = Table.CombineColumns(源,List.Skip(Table.ColumnNames(源),4),each Table.FromRows(List.Select(List.Split(_,3),(x)=>not List.MatchesAll(x,(y)=>y is null))),"h"),
    展开 = Table.ExpandTableColumn(变形, "h", {"Column1", "Column2", "Column3"}, {"成员", "性 别", "关 系"})
    in
    展开

  • 怎样使用 power query 求解 n 元一次方程组? at 2018-09-05 23:38:53

    PBID+Python is the way to work around it...fyi

    file

  • power query 可以开车了你知道吗? at 2018-09-05 11:55:27

    畅神,在用Python Script输出文件至指定路径下的时候,时间序列(type as date)变成了Microsoft.OleDb.Date,如下图所示:
    有没有除了改日期格式为text之外的其它方法?就让他输出为date格式。
    file

  • 如何利用 POWER QUERY 制作简易标签 at 2018-08-15 23:32:53
    = Table.Combine(List.Transform({0..Number.RoundDown(Table.RowCount(源)/2)},each 
                                   [a=List.Range(Table.ToRows(源),_*2,2),
                                    b=Table.FromRows(List.Transform({0..3},each {a{0}{_}?,null,null,null,a{1}?{_}?}))]
                                   [b] ) )