我有吃的食物数据集:
create table test
(group_id integer,
food varchar,
item_type varchar);
insert into test values
(764, 'apple', 'new_food'),
(123, 'berry', 'new_food'),
(123, 'apple', 'others'),
(123, 'berry', 'others'),
(86, 'carrot', 'others'),
(86, 'carrot', 'new_food'),
(86, 'banana', 'others');
在每组中,新食物都是item_type
new_food
。之前正在吃的食物是该组中的任何其他食物都不等于new_food
的值。
我想从中得到的数据集是:
| group | previous_food | new_food |
------------------------------------
764 null apple
123 apple berry
86 banana carrot
但是,我无法正确选择群组。我目前的尝试是:
select
group_id,
max(case when item_type != 'new_food' then food else null end) as previous_food,
max(case when item_type = 'new_food' then food else null end) as new_food
from test
group by group_id
但是,我们不能依赖max()
功能来选择正确的先前食物,因为它们不一定按字母顺序排列。
我只需要!=
new_food
分组中的其他任何食物。我怎么能得到这个?
我可以避免使用子查询还是不可避免的?数据库说我无法嵌套聚合函数,这令人沮丧。
到目前为止,这是我的sqlfiddle:http://sqlfiddle.com/#!17/a2a46/1
编辑:我在这里用子查询解决了这个问题:http://sqlfiddle.com/#!17/dd8b9/12但我们能做得更好吗?当然,必须有一种方法可以在分组中轻松进行这种比较吗?