You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何筛选仅购买travel产品的用户并统计订单数

PostgreSQL筛选仅购买travel产品的用户并统计订单数

需要从购买过travel或books产品的用户列表中,筛选出仅购买过travel产品的用户,并统计这些用户的订单数量。期望结果如下:

user_id    count_orders
-----------------------
4          5
6          2

表结构与测试数据

CREATE TABLE orders 
(
    user_id INTEGER, 
    order_id INTEGER, 
    order_date DATE, 
    price FLOAT, 
    product VARCHAR(255)
);

INSERT INTO orders(user_id, order_id, order_date, price, product)
VALUES
(1, 2, '2021-03-05', 15, 'books'),
(1, 13, '2022-03-07', 3, 'music'),
(1, 14, '2022-06-15', 900, 'travel'),
(1, 11, '2021-11-17', 25, 'books'),
(1, 16, '2022-08-03', 32, 'books'),
(2, 4, '2021-04-12', 4, 'music'),
(2, 7, '2021-06-29', 9, 'music'),
(2, 20, '2022-11-03', 8, 'music'),
(2, 22, '2022-11-07', 575, 'travel'),
(2, 24, '2022-11-20', 95, 'food'),
(3, 3, '2021-03-17', 25, 'books'),
(3, 5, '2021-06-01', 650, 'travel'),
(3, 17, '2022-08-17', 1200, 'travel'),
(3, 19, '2022-10-02', 6, 'music'),
(3, 23, '2022-11-08', 7, 'food'),
(4, 9, '2021-08-20', 3200, 'travel'),
(4, 10, '2021-10-29', 2750, 'travel'),
(4, 15, '2022-07-15', 1820, 'travel'),
(4, 21, '2022-11-05', 8000, 'travel'),
(4, 25, '2022-11-29', 2300, 'travel'),
(5, 1, '2021-01-04', 3, 'music'),
(5, 6, '2021-06-09', 820, 'travel'),
(5, 8, '2021-07-30', 19, 'books'),
(5, 12, '2021-12-10', 22, 'music'),
(5, 18, '2022-09-19', 20, 'books'),
(6, 26, '2023-01-09', 700, 'travel'),
(6, 27, '2023-01-23', 1900, 'travel');

解决方案SQL

写法一:分组过滤法

SELECT user_id, COUNT(order_id) AS count_orders
FROM orders
WHERE user_id IN (
    SELECT user_id
    FROM orders
    WHERE product IN ('travel', 'books')
)
GROUP BY user_id
HAVING COUNT(DISTINCT product) = 1 
   AND MAX(product) = 'travel';

写法二:排除过滤法

SELECT user_id, COUNT(order_id) AS count_orders
FROM orders
WHERE user_id NOT IN (
    SELECT user_id
    FROM orders
    WHERE product = 'books'
)
AND user_id IN (
    SELECT user_id
    FROM orders
    WHERE product = 'travel'
)
GROUP BY user_id;

思路说明

  • 写法一:先通过子查询锁定购买过travel或books的用户范围,再对用户分组,用HAVING子句确保用户仅购买过travel这一种产品,最后统计订单数。
  • 写法二:逻辑更直观,先排除所有购买过books的用户,再筛选出购买过travel的用户,最后统计这些用户的订单总数。

内容的提问来源于stack exchange,提问作者zeroes_ones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:10:15