Импала SQL группа запросов с несколькими условиями - PullRequest
1 голос
/ 28 марта 2019

Учитывая следующую ситуацию:

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);

Как вернуть ровно 1 строку для каждого самолета, где высота наименьшая, а время меньше 6?Наименьшее время следует использовать, когда предыдущие условия возвращают несколько строк для самолета.

Ожидаемые результаты:

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

Это очень большая база данных Apache Impala, поэтому производительность учитывается при рассмотрении этого решения.

Создана скрипка для тестирования (обратите внимание на скрипкуявляется mysql не impala): https://www.db -fiddle.com / f / cyKJ1GrfDZXAbhTpQZi7FP / 2

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Если вы хотите вернуть ровно одну строку для каждого самолета, то на ум приходит 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() может возвращать дубликатыесли есть связи.

0 голосов
/ 28 марта 2019

Выбранная версия 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 поддерживает их тожено синтаксис может немного отличаться)

...