鉴于以下情况:
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而不是黑斑羚):https://www.db-fiddle.com/f/cyKJ1GrfDZXAbhTpQZi7FP/2
您选择的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也支持它们,但语法可能略有不同)
如果你想每架飞机只返回一排,那么就会想到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()
可以返回重复。