【问题标题】:Count distinct over multiple columns in USQL对 SQL 中的多列进行不同计数
【发布时间】:2018-11-10 08:13:07
【问题描述】:

我想计算两列的不同值。

在虚构的 sql 中,我会写如下:

COUNT(DISTINCT col1, col2)

在 T-SQL 中,这是通过在子查询中进行一个分组,然后在外部查询中进行第二个分组来完成的 - like this

据我所知,USQL 没有子查询,所以我有点难以弄清楚如何做到这一点。我想我可以使用两个别名查询,但我想知道是否有更好的方法。

【问题讨论】:

    标签: azure-data-lake u-sql


    【解决方案1】:

    U-SQL 确实支持子查询。它不(尚)支持的是 scalar 子查询和 correlated 子查询(对两者使用连接)。

    所以解决办法

    SELECT COUNT(*) AS count
    FROM (SELECT DISTINCT DocumentId, DocumentSessionId
          FROM DocumentOutputItems) AS internalQuery
    

    或上面链接中提到的SUM(CASE)GROUP BY 都有效。

    另外,U-SQL 还允许您命名内部查询并在外部语句中使用它,这使得脚本在更复杂的情况下更易于阅读(它类似于公共表表达式,因为它只命名查询并且不执行它):

    @inner = 
      SELECT DISTINCT DocumentId, DocumentSessionId
      FROM DocumentOutputItems;
    @result = SELECT COUNT(*) AS count FROM @inner;
    

    【讨论】:

    • 谢谢,我没有在文档中看到任何子查询示例,因此假设它们是不可能的。正如你所说,别名查询通常更具可读性,但我有一个生成 usql 的进程来模拟 CUBE 功能,所以子查询更适合我的进程
    【解决方案2】:

    如果您不能使用子查询,那么一种“丑陋”的方法是连接列:

    SELECT COUNT(DISTINCT String.Concat(col1, '^', col2))
    FROM tab;
    

    当然,您必须处理 NULL 并转换为正确的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2020-12-08
      • 2021-01-23
      相关资源
      最近更新 更多