如果表中的所有行均符合特定条件,我将尝试寻找一种性能良好且易于阅读的查询,以从一列中获取不同的值。
我有一个表,可跟踪电子商务订单以及它们是否按时交付,内容和架构如下:
> select * from orders;
+----+--------------------+-------------+
| id | delivered_on_time | customer_id |
+----+--------------------+-------------+
| 1 | 1 | 9 |
| 2 | 0 | 9 |
| 3 | 1 | 10 |
| 4 | 1 | 10 |
| 5 | 0 | 11 |
+----+--------------------+-------------+
我想获取所有已按时交付所有订单的不同的customer_id。即我想要这样的输出:
+-------------+
| customer_id |
+-------------+
| 10 |
+-------------+
最佳方法是什么?
我已经找到了一种解决方案,但是有点难以理解,我怀疑这是最有效的方法(使用双CTE):
> with hits_all as (
select memberid,count(*) as count from orders group by memberid
),
hits_true as
(select memberid,count(*) as count from orders where hit = true group by memberid)
select
*
from
hits_true
inner join
hits_all on
hits_all.memberid = hits_true.memberid
and hits_all.count = hits_true.count;
+----------+-------+----------+-------+
| memberid | count | memberid | count |
+----------+-------+----------+-------+
| 10 | 2 | 10 | 2 |
+----------+-------+----------+-------+
您如下使用group by
和having
:
select customer_id
from orders
group by customer_id
having sum(delivered_on_time) = count(*)
这是有效的,因为按delivered_on_time = 1
标识了按时交货。因此,您只需要确保delivered_on_time
的总和等于该客户的记录数即可。
您可以使用聚合和having
:
select customer_id
from orders
group by customer_id
having min(delivered_on_time) = max(delivered_on_time);