具有多个条件的impala sql查询分组依据

jljoyd4f  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(386)

鉴于以下情况:

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

它是一个非常大的apacheimpala数据库,因此性能是这个解决方案的一个考虑因素。
为测试创建了一个fiddle(注意fiddle不是impala):https://www.db-fiddle.com/f/cykj1grfdzxabhtpqzi7fp/2

wbgh16ku

wbgh16ku1#

如果你想每架飞机只返回一行,那么 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() 如果有关系,可以返回重复项。

bakd9h0s

bakd9h0s2#

您选择的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

小提琴
(impala也支持它们,但语法可能略有不同)

相关问题