代码之家  ›  专栏  ›  技术社区  ›  David542

计算不同的值?

  •  0
  • David542  · 技术社区  · 2 年前

    Google Sheets有一个功能 COUNTUNIQUE 其中可以获得不同值的数量。在SQL中模拟这种情况的最简单方法是什么?以下是最简单的方法吗?

    WITH tbl AS (
        SELECT 1 a UNION ALL
        SELECT 2   UNION ALL
        SELECT 1  
    ) SELECT COUNT(DISTINCT a) FROM tbl
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Erwin Brandstetter    2 年前

    它不会比以下更简单:

    SELECT count(DISTINCT a) ...
    

    上的索引 (a) 无能为力。

    对于中基数较低的大表 a (许多重复),模拟索引跳过扫描的性能(要好得多)。喜欢:

    WITH RECURSIVE cte AS (
       (   -- parentheses required
       SELECT a
       FROM   tbl
       ORDER  BY 1
       LIMIT  1
       )
       UNION ALL
       SELECT l.*
       FROM   cte c
       CROSS  JOIN LATERAL (
          SELECT a
          FROM   tbl t
          WHERE  t.a > c.a
          ORDER  BY 1
          LIMIT  1
          ) l
       )
    SELECT count(*) FROM cte;
    

    当然不是“更简单”。并且需要索引支持。
    请参阅: