在SQL分组中选择不相等的值

时间:2017-08-23 14:31:22

标签: postgresql group-by case-when

我有吃的食物数据集:

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但我们能做得更好吗?当然,必须有一种方法可以在分组中轻松进行这种比较吗?

0 个答案:

没有答案