在一个唯一的表中,我有多行具有相同的参考信息(ID
)。对于相同的day
,客户有drink
,Appreciation
是1(是)或0(否)。
Table
ID DAY Drink Appreciation
1 1 Coffee 1
1 1 Tea 0
1 1 Soda 1
2 1 Coffee 1
2 1 Tea 1
3 1 Coffee 0
3 1 Tea 0
3 1 Iced Tea 1
我首先试图看看谁喜欢某种饮料,这显然非常简单
Select ID, max(appreciation)
from table
where (day=1 and drink='coffee' and appreciation=1)
or (day=1 and drink='tea' and appreciation=1)
由于我甚至对饮料不感兴趣,因此我使用max
来删除重复项,并且只保留最高评价的泳道。
但我现在要做的是看看谁实际上赞赏他们喝的每一杯酒。同样,我最终对每条车道都不感兴趣,只有ID和欣赏。如何修改我的where
以便在每个ID上完成它?在条件中添加ID也不是选项。我尝试为or
切换and
,但它不会返回任何值。我怎么能这样做?
答案 0 :(得分:1)
这应该可以解决问题:
SELECT ID
FROM table
WHERE DRINK IN ('coffee','tea') -- or whatever else filter you want.
group by ID
HAVING MIN(appreciation) > 0
它的作用是: 它寻找最小的升值,并确保该组中所有行的大于0。并且该组是ID,如group by子句中所定义。
你可以看到我正在使用having子句,因为你在where部分中不能有聚合函数。
当然,您可以根据需要将其他表连接到查询中。请注意不要通过连接添加一些不需要的过滤器,这可能会减少此查询中的数据集。