【问题标题】:SQL get counts of unique valuesSQL 获取唯一值的计数
【发布时间】:2021-04-25 09:07:35
【问题描述】:

使用 sqlite3,我如何获得这个示例内存数据库的不同“计数”列? 使用版本 3.27.2

示例数据库

CREATE TABLE events (
    id1, 
    id2, 
    id3, 
    PRIMARY KEY (id1, id2)
);

INSERT INTO events (id1, id2, id3)
VALUES 
   (1,1,99),
   (1,2,99),
   (1,3,52),
   (2,1,6),
   (2,2,7),
   (2,3,8)
;

.mode columns
.header on
SELECT * FROM events;

所需的打印输出

部分成功 以下适用于前两个新列。

SELECT id1, count(id3) AS total_count, count(DISTINCT id3) AS unique_count
FROM events
GROUP BY id1;

获取最后一列的最佳方法是什么?以下返回error: no such column: total_count

SELECT id1, count(id3) AS total_count, count(DISTINCT id3) AS unique_count, (total_count - unique_count) AS repeated_count
FROM events
GROUP BY id1;

【问题讨论】:

  • 总计数减去唯一计数不会得到重复计数。请参阅我对此的回答。 (如果你只想要total_count - unique_count,你可以使用count(*) - count(distinct id3)。你不能在定义它们的同一个子句中访问别名。)

标签: sql sqlite count distinct


【解决方案1】:

如果你group by id1, id3 喜欢这样:

SELECT id1, id3, COUNT(*) counter
FROM events
GROUP BY id1, id3;

你得到id1, id3的每个组合的行数:

id1 id3 counter
1 52 1
1 99 2
2 6 1
2 7 1
2 8 1

现在,你要做的就是:

  • 将每个id1 的列counter 相加得到该列 total_count
  • 统计每个id1的行数,得到 专栏unique_count
  • 计算每个id1的行数,其中 列counter 是> 1 以获取列repeated_id3

您可以使用SUM() 和COUNT() 窗口函数来做到这一点:

SELECT DISTINCT id1, 
       SUM(COUNT(*)) OVER (PARTITION BY id1) AS total_count, 
       COUNT(*) OVER (PARTITION BY id1) AS unique_count,
       SUM(COUNT(*) > 1) OVER (PARTITION BY id1) repeated_id3
FROM events
GROUP BY id1, id3;

请参阅demo。
结果:

id1 total_count unique_count repeated_id3
1 3 2 1
2 3 3 0

【讨论】:

    【解决方案2】:

    也许可以试试 CTE。尚未验证语法,但这似乎是查看 SQLlite 文档的有效选项。

    With X as 
    (
    SELECT id1, count(id3) AS total_count, count(DISTINCT id3) AS unique_count
    FROM events
    GROUP BY id1;
    )
    select id1, total_count, unique_count, (total_count - unique_count) AS repeated_count
    from X
    

    【讨论】:

      【解决方案3】:

      这并不容易:-)

      在

      (1,1,99), (1,2,99), (1,3,52)
      

      有一个 ID 重复(99)。

      在

      (1,1,99), (1,2,99), (1,3,52), (1,4,99)
      

      又有一个 ID 重复(仍然是 99)。

      在

      (1,1,99), (1,2,99), (1,3,52), (1,4,52)
      

      有两个重复的 ID(52 和 99)。

      仅按 ID1 聚合时,您会丢失该知识。您会看到有多少行以及有多少不同的 ID3,但看不到这些 ID3 中有哪些重复。这意味着您需要一个中间步骤,即最终聚合之前的预聚合。

      select
        id1,
        count(*) as total_count,
        count(distinct id3) as unique_count,
        count(case when cnt > 1 then 1 end) as repeated_count
      from
      (
        select id1, id3, count(*) as cnt
        from events
        group by id1, id3
      ) pre_aggregated
      group by id1
      order by id1;
      

      【讨论】:

        猜你喜欢
        • 2012-10-20
        • 1970-01-01
        • 2021-04-11
        • 2011-06-22
        • 1970-01-01
        • 2017-10-12
        • 2020-11-09
        • 2020-11-13
        • 1970-01-01
        相关资源
        最近更新 更多