Impala SQL 多条件查询分组
Impala SQL query group by with multiple conditions
鉴于以下情况:
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);
如何return高度最小且时间小于6的每架飞机正好1排?前面的条件return多行时,应该用最小的时间为一架飞机。
预期结果:
2, 'klm', 603
1, 'klm2', 601
它是一个非常大的 Apache Impala 数据库,因此性能是此解决方案的一个考虑因素。
创建了一个 fiddle 用于测试(注意 fiddle 是 mysql 而不是 impala):https://www.db-fiddle.com/f/cyKJ1GrfDZXAbhTpQZi7FP/2
您选择的 MySQL 版本不支持 window 功能,但 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 也支持它们,但语法可能略有不同)
如果您想 return 每架飞机恰好排成一排,那么 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()
可以 return 重复。
鉴于以下情况:
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);
如何return高度最小且时间小于6的每架飞机正好1排?前面的条件return多行时,应该用最小的时间为一架飞机。
预期结果:
2, 'klm', 603
1, 'klm2', 601
它是一个非常大的 Apache Impala 数据库,因此性能是此解决方案的一个考虑因素。
创建了一个 fiddle 用于测试(注意 fiddle 是 mysql 而不是 impala):https://www.db-fiddle.com/f/cyKJ1GrfDZXAbhTpQZi7FP/2
您选择的 MySQL 版本不支持 window 功能,但 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 也支持它们,但语法可能略有不同)
如果您想 return 每架飞机恰好排成一排,那么 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()
可以 return 重复。