Максимальная аналитическая функция плюс оконный порядок не работает должным образом - PullRequest
0 голосов
/ 26 марта 2020

У меня есть таблица со статусом и местоположением, ниже приведены данные. Я хотел бы получить максимальный статус, разделенный по местоположению, используя пользовательский порядок. Есть идеи, что нужно изменить? Прямо сейчас это дает только максимальное значение, независимо от порядка, который я упомянул.

Пользовательский порядок: 1> 3> 2

status | location
  1    | 11 
  2    | 11 
  2    | 12 
  3    | 12
  3    | 11

Ожидаемый результат для местоположения 11: 1 Ожидаемый результат для местоположения 12: 3

Запрос:

select max(status) over (partition by location order by decode(status, '1',6,'3',5,'2',4,3) 
                         rows between unbounded preceding and unbounded following) mx from items;

http://sqlfiddle.com/#! 4 / ed9e7e / 13

create table items
( status varchar2(1), location number(9)
);

insert into items values('1',123);

insert into items values('2',123);

insert into items values('3',123);

insert into items values('4',123);

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Я думаю, вы хотите first_value():

select first_value(status) over (partition by location
                                 order by decode(status, '1', 6, '3', 5, '2', 4, 3) 
                                ) mx
from items;

Я не большой поклонник decode(), но это краткий способ express, что вы хотите. Я предпочитаю case выражений.

1 голос
/ 27 марта 2020

Я полагаю, что использование простой GROUP BY может оказаться проще:

SELECT LOCATION,
       DECODE(MAX(ORDERING), 6, '1', 5, '3', 4, '2', 3) AS STATUS
  FROM (SELECT LOCATION,
               STATUS AS STATUS,
               DECODE(STATUS, '1', 6, '3', 5, '2', 4, 3) AS ORDERING
          FROM ITEMS)
  GROUP BY LOCATION
  ORDER BY LOCATION

db <> скрипка здесь

1 голос
/ 26 марта 2020

Я вижу пару вопросов. Кажется, ваш декодер не совпадает с тем, что вы хотите. Во-вторых, я не думаю, что MAX () - это функция, которую вы хотите использовать, потому что она возвращает максимальный статус без учета вашего пользовательского заказа. Вместо этого вы должны назначить номера строк, разделенные по местоположению и упорядоченные в соответствии с вашим пользовательским порядком сортировки. Затем выберите все строки, где номер строки равен 1.

create table items
( status varchar2(1), location number(9)
);

insert into items values('1',11);
insert into items values('2',11);
insert into items values('2',12);
insert into items values('3',12);
insert into items values('3',11);

select x.location, x.status
from (
    select ROW_NUMBER() over (partition by location order by decode(status, '1',1,'2',3,'3',2,4)) as rn, 
           status, location from items) x
where x.rn = 1

SQL Fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...