我有一个 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
查询成功返回了 Chris 和 John,但没有 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/