SQL VS. DAX:数据查询的功能对比

SQL与DAX在数据查询中各有所长——SQL简洁高效完成投影与筛选,DAX凭借多遍聚合与中间表计算在复杂分析中独占优势。适合数据分析师与BI从业者理解工具分工。

作为高大上的分析语言,DAX可以像SQL一样实现数据集的查询,并能在更复杂的分析中游刃有余。

数据查询(query)可以分为两个基本类型:Project Columns投影字段列、Filter Rows筛选明细行。

➊ 投影筛选:SQL简洁而DAX显笨拙
➋ 领域分工:SQL查数据DAX做分析
➌ DAX优势:多遍聚合与中间表计算

1、SQL和DAX投影字段

在SQL中,SELECT之后直接指定字段列,就能实现查询列,这里不会对明细行做任何的限制。

-- 查询 -- project
select       				-- 指定分组,完成聚合
"Country/Region",    
"Quantity"
from public.sales
SELECTCOLUMNS (sales,
        Sales[CustomerKey],
        Sales[ProductKey],
        Sales[Order Number],
        Sales[Quantity],
        Sales[Unit Price]
        )
SUMMARIZECOLUMNS (
        Sales[Order Number],         --  group by 
        "@total-qty", SUM(Sales[Quantity]) 
    )

2、SQL和DAX筛选明细行

SQL筛选有多个功能实现,最简单的是where。如果要保留所有的字段列(不投影指定字段,或者说全部投影),只需要SELECT * FROM结合WHER即可完成。

不过,企业环境中不推荐使用SELECT * 的操作,此时就要和投影字段列和筛选明细行结合起来。如下所示。

-- 保留所有的字段列,使用where增加限制条件
select       				
*
from public.sales
where "Segment" ='Consumer' -- 返回满足条件的数据明细


-- 问题的经典结构
select       				-- 指定分组,完成聚合
"Country/Region",    
SUM("Quantity")  as "total qty"  -- 聚合的最常见的类型 
from public.sales
where "Segment" ='Consumer' -- 返回满足条件的数据明细
group by  "Country/Region"

比如,要对数据表Sales做条件筛选(比如保留2007年6月4日的交易行),可以如下完成:

// 执行字段投影和筛选 使用filter
EVALUATE
filter(
    sales
    Sales[Order Date]) =date(2007,6,4)
    )
// 执行字段投影和筛选 使用filter
EVALUATE
filter(
    SELECTCOLUMNS ( 
       sales,
       Sales[CustomerKey],
       Sales[Order Date]
    ),
     Sales[Order Date]) =date(2007,6,4)
    )

3、SQL和DAX的简单对比

而DAX是天生的分析高手,查询反而不是它的强项,所以看上去比SQL还要笨拙一些(特别是同时投影和筛选时)。

其次,作为天生的分析工具,DAX用逻辑上的复杂性,换取了更深、更大空间的可能性,特别是在复杂的多遍聚合、中间表计算时,用各种预置的函数就可以完成分析工作。

这样的好处是,它很专业;代价是,太专业了吓到了很多初学者。

by 喜乐君

No comments yet