У меня есть таблица шаблонов, которая содержит несколько идентификаторов TypeID для каждого TemplateID. У меня есть таблица Items с ItemName, ItemPrice и TypeID. Мне нужно получить наиболее распространенное ItemName и самую высокую цену в этом ItemName для каждого TypeID, который прикреплен к выбранному шаблону. Мой запрос не работает, поскольку, очевидно, он возвращает несколько строк из ItemsTable для каждого TypeID из-за внутреннего joi, но я не могу найти способ написать запрос. Мой запрос:

select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice
from Templates t 
inner join (select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
        from Items i
        group by i.TypeID, i.ItemName) n on n.TypeID=t.TypeID
WHERE t.TemplateID=2;

Результат, который я хотел бы видеть, такой:

TemplateID 1:

  • TypeID 1 - общее название предмета, его максимальная цена
  • TypeID 2 - общее название предмета, его максимальная цена

...и т.д

0
fra 8 Сен 2020 в 15:54

1 ответ

Лучший ответ

Попробуй это:

WITH DataSource AS
(
    select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice, ROW_NUMBER() OVER (PARTITION BY t.TemplateID, t.TypeID ORDER BY foundn DESC) as rn
    from Templates t 
    inner join 
    (
        select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
        from Items i
        group by i.TypeID, i.ItemName
    ) n 
        on n.TypeID=t.TypeID
    WHERE t.TemplateID=2
)
SELECT *
FROM DataSource
WHERE rn = 1

Идея состоит в том, чтобы использовать ROW_NUMBER для генерации идентификатора строки для каждой пары шаблон - тип, начиная с той, у которой самый большой foundn. Затем отобразите только те, у которых ID строки = 1.

1
gotqn 8 Сен 2020 в 12:58