动态分区以及参数限制行数的写法
2020-06-30 本文已影响0人
BI罗
let
Source = #"SQL/b2bc********** database xxxx-***-****-cdhdp-01",
all = Source{[Schema="dbo",Item="Fact_lyNI"]}[Data],
r1000 = Table.Range(all,0,1000),
r10000 = Table.Range(all,0,10000),
r0 = Table.Range(all,0,0)
in
if Para="all" then all else if Para="r1000" then r1000 else if Para="r10000" then r10000 else r0
下面是更好的参数写法,可以直接看到本机查询(查询折叠)
let
Source = #"SQL/b2bcxxxxxxx-01",
all= Source{[Schema="dm",Item="V_Fact_y_v2"]}[Data],
r1000= Table.FirstN(all,1000),
r=if (Para)="r1000" then Table.FirstN(all,1000) else all
in
r
let
Source = #"SQL/bxxxxxx",
d= Source{[Schema="dm",Item="V_Fact_xily"]}[Data],
//r=Table.Range(d,0,TopRows)
r= Table.FirstN(d,TopRows)
in
r
Table.FirstN和Table.Range的作用都可以用来现在行数,但是Table.Range选择的行数区间更灵活,经过测试这两种方法都都能触发折叠查询
let
x1=Date.AddMonths(Date.AddDays(DateTime.LocalNow(), -2),-3),//etl date
x2=Date.ToText(#date(Date.Year(x1),Date.Month(x1),1)), //4 month ago
r1000 = "top 1000",
r10000 = "top 10000",
r1 = "top 1",
r=if Para="all" then "" else if Para="r1000" then r1000 else if Para="r10000" then r10000 else r1,
all = Sql.Database("b2b*******.database.chinacloudapi.cn",
"B2B-qa-*****-cd-01",
[Query="select "&r&" * from [dbo].[Fact_daily] where trans_date>='"&x2&"'",CommandTimeout=#duration(0,1,0,0),MultiSubnetFailover=true])
in
all
//月初的另一种写法
// start_date = Date.StartOfMonth(#date(2020, 2, 1)),
// end_date = Date.AddMonths(start_date, 1),
//start_date = Date.StartOfMonth(#date(2019, 1, 1)),
// end_date =DateTime.Date(Date.AddMonths(Date.StartOfMonth(Date.AddDays(DateTime.LocalNow(), -2)),-3)),
//DateTime.Date返回日期格式非日期时间格式,才能与start_date日期进行比较
sql语句导入方法会阻止查询折叠,可以table.view的方法手动触发查询折叠,避免二次查询
https://www.jianshu.com/p/eff0647e3ac5
为什么需要查询折叠
pq的很多操作都会阻止折叠查询(pq的查询,微软更推荐将pq的查询语句下压到数据源),命名,或者参数限制行数不会阻止查询折叠:
因此推荐可以用参数来限制行数(并且推荐Table.FirstN或者Table.Range的写法,不推荐sql拼接参数)
在表非常大的情况下,先用参数限制行数,然后再进行其他ETL的工作
let
Source = #"SQLxxxxx",
x = Source{[Schema="dm",Item="V_Fact_v2"]}[Data],
start_date = Date.StartOfMonth(#date(2019, 1, 1)),
end_date =DateTime.Date(Date.AddMonths(Date.StartOfMonth(Date.AddDays(DateTime.LocalNow(), -2)),-3)),//DateTime.Date返回日期才能作比较
all = Table.SelectRows(x, each [Daily] >= start_date and [Daily] < end_date),
//时间区间为2019-1-1至当前时间往前的第4个月,例如现在2021-1-1,X分区就是2019-1-1到2020-9-30,runbook每月T-2为1号自动合并M-4分区到X分区
r=if (Para)="r1000" then Table.FirstN(all,1000) else all
in
r