Выберите минимальную группу our_price по test_id - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть запрос, который возвращает результаты в следующем порядке структуры по возрастанию нашей_прибыли

SELECT our_price,
       mrp,
       marketplace_id,
       test_id
FROM   marketplace_test_mapping mtm
       INNER JOIN marketplace m
               ON m.id = mtm.marketplace_id
WHERE  m.city_id = 1
       AND mtm.test_id IN ( 36, 23, 43, 107,
                            121, 82 )
ORDER  BY our_price ASC;  

ВЫХОД

our_price | mrp | marketplace_id | test_id
----------+-----+----------------+--------
50         90     3                23
51         70     2                23
52         88     1                23
53         80     3                24
54         90     2                24
55         90     4                23
56         90     1                25
57         90     2                25
58         90     1                24

Я хочу получить минимумцена для каждого test_id, но когда я группирую_by на test_id, она также сортирует marketplace_id и возвращает следующее

SELECT *
FROM   (SELECT our_price,
               mrp,
               marketplace_id,
               test_id
        FROM   marketplace_test_mapping mtm
               INNER JOIN marketplace m
                       ON m.id = mtm.marketplace_id
        WHERE  m.city_id = 1
               AND mtm.test_id IN ( 36, 23, 43, 107,
                                    121, 82 )
        ORDER  BY our_price ASC) AS temp_marketplace_test_mapping
GROUP  BY test_id; 

Фактический результат

our_price | mrp | marketplace_id | test_id
----------+-----+----------------+--------
52         88     1                23
58         90     1                24
56         90     1                25

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

our_price | mrp | marketplace_id | test_id
----------+-----+----------------+--------
50         90     3                23
53         90     3                24
56         90     1                25

Разница в обоих результатах заключается в том, что actual output также сортирует marketplace_id при группировании по test_id.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018
WITH cte (our_price,mrp,marketplace_id,test_id) AS
(SELECT our_price,mrp,marketplace_id,test_id
FROM   marketplace_test_mapping mtm
       INNER JOIN marketplace m
       ON m.id = mtm.marketplace_id
WHERE  m.city_id = 1 AND mtm.test_id IN ( 36, 23, 43, 107,121, 82 )
)
select t1.our_price, t1.mrp, t1.marketplace_id, t1.test_id from cte t1 
join (select test_id, min(our_price) our_price from cte group by test_id) t2
on t1.test_id = t2.test_id and t1.our_price = t2.our_price;
0 голосов
/ 18 декабря 2018

Найдите минимальную цену для каждого test_id, а затем получите MARKETPLACE_ID и MRP для этого.

with transactions as (
  -- get the transactions list, execute filters
  SELECT test_id, marketplace_id, mrp, our_price       
  FROM   marketplace_test_mapping mtm
  INNER JOIN marketplace m ON m.id = mtm.marketplace_id
  WHERE  m.city_id = 1
  AND mtm.test_id IN (23,36,43,82,107,121) --it's a good practice to sorta data in IN clause
)

-- if there are few marketplaces with minimum price on each test_id
-- then each of then will be shown
select a.*, b.marketplace_id, b.mrp
from (
  -- minimum price for each test_id
  select test_id, min(our_price) as our_price_min
  from transactions
  group by test_id
) a
left join transactions b on a.test_id = b.test_id and a.our_price_min = b.our_price
order by a.test_id, b.marketplace_id
0 голосов
/ 18 декабря 2018

«Я хочу получить минимальную цену для каждого test_id»

select test_id, min(our_price) as our_price_min -- changed
from marketplace_test_mapping  mtm
inner join marketplace m on m.id=mtm.marketplace_id
where m.city_id=1 and mtm.test_id in (36,23,43,107,121,82)
group by test_id -- added
order by our_price asc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...