Sqlite - 使用 GROUP BY 选择 DISTINCT

标签 sqlite group-by count

我有一个 SQLite 表,我想在其中过滤购买了 2 个或更多不同商品的客户。该表如下所示:


customer  | product | quantity | date of purchase
---------------------------------------------
John      | coffee  |    1     |    02.20.2019
Bob       | coffee  |    2     |    01.13.2018
Chris     | milk    |    1     |    02.03.2012
Alice     | bread   |    1     |    05.01.2019
John      | banana  |    2     |    08.04.2015
Mary      | orange  |    3     |    12.16.2018
Mary      | orange  |    2     |    04.21.2019
Chris     | pie     |    1     |    07.02.2004

我成功地通过使用 GROUP BY 查询中的两行(客户和产品)对客户进行分组来选择客户:

SELECT * FROM test_table GROUP BY customer, product

这(几乎)为我提供了我最初想要的所有客户,除了它还包括玛丽,这不是所需的输出(她没有购买两个不同的 产品)。我尝试使用 COUNT DISTINCT 函数仅向购买了两种或多种不同产品的客户显示,如下所示:

SELECT customer, product, COUNT(DISTINCT(product)) AS counter FROM test_table
GROUP BY customer, product HAVING counter>1

查询成功返回了 ChrisJohn,但没有 Mary,但是它只输出它们一次,仅显示它们的其中一个产品已经买了。有没有办法让克里斯和约翰获得他们购买的所有不同产品?查询的预期输出:

John      | coffee  |    1     |    02.20.2019
John      | banana  |    2     |    08.04.2015
Chris     | milk    |    1     |    02.03.2012
Chris     | pie     |    1     |    07.02.2004

最佳答案

使用聚合:

SELECT *
FROM test_table
WHERE customer IN (SELECT customer
                   FROM test_table
                   GROUP BY customer
                   HAVING MIN(product) <> MAX(product));

上面的HAVING子句断言“最小”和“最大”产品不相同,这意味着至少有两个与每个产品相关联的不同产品匹配客户。

对于更复杂的解决方案,我们可以在此处使用分析函数:

WITH cte AS (
    SELECT *, MIN(product) OVER (PARTITION BY customer) AS min_product,
              MAX(product) OVER (PARTITION BY customer) AS max_product
    FROM test_table
)

SELECT customer, product, quantity, date_of_purchase
FROM cte
WHERE min_product <> max_product;

关于Sqlite - 使用 GROUP BY 选择 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64798262/

相关文章:

sqlite - 不可为 null 的列中的默认值被忽略

python - 通过 python 设置 SQLite 数据库的(默认)编码

c# - SQLite 以整数形式保存浮点值

mysql - 检索每组中的最后一条记录 - MySQL

php - 返回准备好的语句中的计数总数

python - 在应用程序上下文之外创建数据库

mysql - GROUP和ORDER Mysql在列中获取不同的数据

python - Pandas 在一列上进行分组,在第二列上聚合,保留第三列

python - 计算子串出现的次数

sql - count (*) 和 count(attribute_name) 有什么区别?