Ищите функцию SQL -Server для определения минимальной / максимальной строки и извлечения информации из этих строк - PullRequest
1 голос
/ 30 марта 2020

Представьте данные в этом формате:

Customer, Object, Price
[William, Orange, 100p
William, Apple, 80p
William, Banana 60p
Casper, Cola, 150p
Casper, Beer, 120p
Casper, Peanuts, 200p]

Я заинтересован в извлечении наиболее и наименее дорогой покупки для каждого покупателя вместе с фактическим товаром.

Результат должен выглядеть следующим образом это.

Customer, MostExpItem, MostExpCost, LeastExpItem, LeastExpCost
William, Orange, 100p, Banana, 60p
Casper, Peanuts, 200p, Beer, 120p

Есть указатели? Я могу использовать группу, чтобы легко извлечь минимальные / максимальные значения. Требуется ли подзапрос для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

В Postgres вы можете использовать массивы, если хотите избежать подзапросов:

select customer,
       min(price),
       (array_agg(order by price))[1],
       max(price),
       (array_agg(order by price desc))[1]
from t
group by customer;
0 голосов
/ 30 марта 2020

Вы можете использовать оконные функции:

select
    customer,
    max(object) filter(where price = most_exp_price) most_exp_item,
    most_exp_price,
    max(object) filter(where price = less_exp_price) less_exp_item,
    less_exp_price
from (
    select 
        t.*, 
        max(price) over(partition by customer) most_exp_price,
        min(price) over(partition by customer) less_exp_price
    from mytable t
) t
where price in (most_exp_price, less_exp_price)
group by customer

Подзапрос вычисляет максимальную и минимальную цену на одного клиента. Внешний запрос фильтрует верхнюю и нижнюю цены, агрегирует по клиенту и отображает соответствующие позиции.

...