动态分区以及参数限制行数的写法

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
上一篇下一篇

猜你喜欢

热点阅读