【2017年3月29日优化】
之前留下一个尾巴:如何自动获取表头。我在原文中使用了比较笨的办法。今天看到一篇帖子,提到了可以用Table.FromList()函数来单独构造行和表头。于是将原来的代码优化如下:
let
源 = Excel.CurrentWorkbook(){[Name="factTbl"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"Year", type text}, {"Income", type text}, {"ID", type text}}),
转换为随机list = List.Range(Table.ToList(更改的类型),Number.RoundDown(Number.RandomBetween(0,Table.RowCount(更改的类型))),Number.RoundDown(Number.RandomBetween(0,Table.RowCount(更改的类型)))),
转换为表 = Table.FromList(转换为随机list, Splitter.SplitTextByDelimiter(","), Table.ColumnNames(更改的类型), null, ExtraValues.Error),
更改的类型1 = Table.TransformColumnTypes(转换为表,{{"ID", Int64.Type}, {"Month", type text}, {"Year", Int64.Type}, {"Income", type number}, {"Chanel", type text}, {"Goes To", type text}, {"Social", type text}})
in
更改的类型1
【以下是原文】
无意中读到这篇帖子,作者介绍了一种通过筛选列来获取一个表中的随机记录的方法。
但是这个方法并没有完全做到随机,比如每次刷新后,都是获取的四个“Goes To”列中的值的记录:
而我想要的是这个表里的记录完全随机。也就是每次刷新,随机显示这1000行数据,有可能一次显示1行,也有可能一次显示100行,还有可能显示999行,而且顺序也是完全随机的。
以下是实现方法:
let
源 = Excel.CurrentWorkbook(){[Name="factTbl"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"Year", type text}, {"Income", type text}, {"ID", type text}}),
转换为随机list = List.Range(Table.ToList(更改的类型),Number.RoundDown(Number.RandomBetween(0,Table.RowCount(更改的类型))),Number.RoundDown(Number.RandomBetween(0,Table.RowCount(更改的类型)))),
转换为表 = Table.FromList(转换为随机list, Splitter.SplitTextByDelimiter(","), null, null, ExtraValues.Error),
降级原始标题行 = Table.DemoteHeaders(更改的类型),
获取新表的标题 = Table.FirstN(降级原始标题行,1),
追加的查询 = Table.Combine({获取新表的标题, 转换为表}),
提升的标题 = Table.PromoteHeaders(追加的查询, [PromoteAllScalars=true])
in
提升的标题
遇到的最大难题是怎么恢复原来的表头,我用了比较笨的办法。想要找一个更优雅的方式,没有成功。
这里是原始数据:http://pan.baidu.com/s/1pLptcON