如果所有行均符合特定条件,则从一列中获取不同的值

问题描述 投票:0回答:2

如果表中的所有行均符合特定条件,我将尝试寻找一种性能良好且易于阅读的查询,以从一列中获取不同的值。

我有一个表,可跟踪电子商务订单以及它们是否按时交付,内容和架构如下:

> 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 |
+----------+-------+----------+-------+
sql group-by
2个回答
1
投票

您如下使用group byhaving

select customer_id
from orders
group by customer_id
having sum(delivered_on_time) = count(*)

这是有效的,因为按delivered_on_time = 1标识了按时交货。因此,您只需要确保delivered_on_time的总和等于该客户的记录数即可。


0
投票

您可以使用聚合和having

select customer_id
from orders
group by customer_id
having min(delivered_on_time) = max(delivered_on_time);
© www.soinside.com 2019 - 2024. All rights reserved.