Как я могу сделать групповой вызов с максимальным значением? - PullRequest
0 голосов
/ 25 июня 2018

Я отслеживаю цены на игры в нескольких магазинах.У меня есть таблица games:

id | title       | platform_id
---|-------------|-----------
1  | Super Mario | 1
2  | Tetris      | 3
3  | Sonic       | 2

a stores таблица:

id | title       
---|-------------
1  | Target 
2  | Amazon      
3  | EB Games       

и таблица copies с одной записью для копии цели данной игры, одназапись для Amazon и т. д. Я сохраняю SKU, чтобы использовать его при очистке их веб-сайтов.

game_id | store_id | sku
--------|----------|----------
1       | 2        | AMZ-3F4YK
1       | 3        | 001481

Я запускаю одну очистку в день, неделю или даже дольше и сохраняю результат в виде центов вprices таблица:

sku       | price   | time
----------|---------|------
AMZ-3F4YK | 4010    | 13811101
001481    | 3210    | 13811105

Плюс таблица платформ, которая просто сопоставляет идентификаторы с именами.

Вот где я запутался и застрял.

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

games.title | platform_name | info
------------|---------------|------
Super Mario | NES           | EB Games,1050;Amazon,3720;Target,5995
Tetris      | Game Boy      | EB Games,3720;Amazon,410;Target,5995

Моя лучшая попытка на данный момент -

select
    games.title as title,
    platforms.name as platform,
    group_concat(distinct(stores.name) || "~" || prices.price) as price_info
from games
join platforms on games.platform_id = platforms.id
join copies on copies.game_id = games.id
join prices on prices.sku = copies.sku
join stores on stores.id = copies.store_id
group by title

. К каким сетям относятся результаты, такие как

Super Mario | NES | EB Games~2300,Target~2300,Target~3800

, то есть включает каждую цену.в списке, когда я хочу только один в магазине (и чтобы он был самым последним).Выяснение того, как интегрировать подзапрос «выбрать цену, где id = (выберите идентификатор из max (time) ...») и т. Д., Полностью обескуражило меня всю ночь, и я был бы признателен за любой совет, который кто-нибудь мог бы мне предложить.

Я использую SQLite, но если в Postgres есть лучший вариант, я мог бы сделать это там.

1 Ответ

0 голосов
/ 25 июня 2018

Вам нужно два уровня агрегации.,,И Postgres намного проще для этого, поэтому я буду использовать синтаксис Postgres:

select title, platform,
       string_agg(s.name || '~' pr.price order by s.name)
from (select distinct on (g.title, p.name, s.name) g.title as title, p.name as platform, s.name, pr.price
      from games g join
           platforms p
           on g.platform_id = p.id join
           copies c
           on c.game_id = g.id join
           prices pr
           on pr.sku = c.sku join
           stores s
           on s.id = c.store_id
      group by g.title, p.name, s.name, pr.time desc
     ) gps
group by title, platform
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...