在 USQL 中对多个列进行不同计数

Count distinct over multiple columns in USQL

我想对两列进行不同计数。

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

COUNT(DISTINCT col1, col2)

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

据我所知,USQL 没有子查询,所以我在尝试弄清楚如何执行此操作时遇到了困难。我想我可以使用两个别名查询,但我想知道是否有更好的方法。

如果您不能使用子查询,那么一种 "ugly" 方法是连接列:

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

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

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

所以解决方案

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

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

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

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