Impala SQL查询按多个条件分组

时间:2019-03-28 20:16:43

标签: sql impala

鉴于以下情况:

CREATE TABLE IF NOT EXISTS `table1` (
  `time` int(11) NOT NULL,
  `aircraft` varchar(50) NOT NULL,
  `height` int(11) NOT NULL
);

INSERT INTO `table1` (`time`, `aircraft`, `height`) VALUES
(1, 'klm', 605),
(2, 'klm', 603),
(3, 'klm', 705),
(6, 'klm', 505),
(1, 'klm2', 601),
(2, 'klm2', 605),
(3, 'klm2', 605),
(4, 'klm2', 705),
(5, 'klm2', 601),
(6, 'klm2', 301);

对于高度最小且时间小于6的每架飞机,如何精确返回1行?当先前条件返回飞机的多行时,应使用最短的时间。

预期结果:

2, 'klm', 603
1, 'klm2', 601

这是一个非常大的Apache Impala数据库,因此性能是此解决方案的考虑因素。

创建了一个用于测试的小提琴(请注意,小提琴是mysql而非impala):https://www.db-fiddle.com/f/cyKJ1GrfDZXAbhTpQZi7FP/2

2 个答案:

答案 0 :(得分:0)

您选择的MySQL版本不支持窗口功能,但MySQL v8.0支持它们:

select *
from
(
    select 
        time,
        aircraft,
        height,
        rank() over(partition by aircraft order by height, time asc) as rh
    from table1
    where time < 6
) inner_query
where rh = 1

Fiddle

(Impala也支持它们,但语法可能略有不同)

答案 1 :(得分:0)

如果您想每架飞机精确返回一行,那么row_number()就会浮现出来:

select t1.*  -- or whatever column you want
from (select t1.*,
             row_number() over (partition by aircraft order by height) as seqnum
      from t1
      where time < 6
     ) t1
where seqnum = 1;

您特别希望使用row_number()而不是rank(),因为如果有联系,rank()可以返回重复项。