跳至正文

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

标签:

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

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

1、SQL和DAX投影字段

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

-- 查询 -- project
select       				-- 指定分组,完成聚合
"Country/Region",    
"Quantity"
from public.sales

在DAX中,可以使用SELECT COLUMNS实现类似的操作。

     SELECTCOLUMNS (sales,
        Sales[CustomerKey],
        Sales[ProductKey],
        Sales[Order Number],
        Sales[Quantity],
        Sales[Unit Price]
        )

当然,在SQL中,可以使用AS为字段重命名;在DAX中,重命名在字段之前,在使用summarizecolumn时,这个是必选项。

     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"

在DAX中,筛选明细行也有很多方法,典型的是FILTER。

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

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

当然,更多情况下,分析师还是仅仅需要保留自己需要的少数字段,这就需要投影字段列和筛选行的结合,这个过程,相比SQL略显复杂一些——如下所示,借助于filter中嵌套selectcolumn表操作函数完成。

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

3、SQL和DAX的简单对比

首先,SQL天生是为查询数据而生的,所以在查询明细并做简单处理时,语法清晰、逻辑简单,但是在处理复杂分析问题(包含聚合)时逐渐略显老态,SQL直到很久才支持窗口函数(可以完成聚合的多遍聚合)。Tableau的逻辑是SQL +VIZ,所以既能延续SQL的简洁、优雅,又具备了可视化的美观。

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

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

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

by 喜乐君

《SQL VS. DAX:数据查询的功能对比》有1个想法

  1. Pingback: 数据分析,绕不过SQL、DAX、VizQL(上) - 喜乐君

评论已关闭。